Given an array, the task is to shift the middle element to the start and end of the array alternatively, till the middle element becomes equal to the first element of the original array.
Input: arr[]=[2, 8, 5, 9, 10]
Output: [9, 5, 2, 10, 8]
Explanation: We can get this output by shifting middle element
step1: middle element 5 is shifted to front of array [5, 2, 8, 9, 10]
step2: middle element 8 is shifted to end of array [5, 2, 9, 10, 8]
step3: middle element 9 is shifted to front of array [9, 5, 2, 10, 8]
Input: arr[]=[10, 12, 6, 5, 3, 1]
Output: [1, 3, 5, 10, 6, 12]
Naive Approach: Shift the middle element of the array alternatively to the start and end of the array.
Take the middle element and shift it to the start of the Array if c is even or shift it to the end of Array if c is odd. Terminate the loop when the middle element becomes equal to the first element of the Original Array.
Below is the implementation of the above approach :
// C++ program for above approach #include <bits/stdc++.h> using namespace std;
// Function for shifting middle element. void AlternateShift(vector< int >& arr, int x)
{ // get middle index
int mid = arr.size() / 2;
// initialize c to 0
int c = 0;
// Shift middle element
// till its value not equals to x.
while (arr[mid] != x) {
// pop middle element
int z = arr[mid];
arr.erase(arr.begin() + mid);
// if c is even then insert z
// at start of the array
if (c % 2 == 0)
arr.insert(arr.begin() + 0, z);
// if c is odd then insert z
// at end of the array
else
arr.push_back(z);
// increment count c
c += 1;
}
} int main()
{ vector< int > Arr = { 2, 8, 5, 9, 10 };
// initialize a to zero index array value
int a = Arr[0];
// call AlternateShift function
AlternateShift(Arr, a);
// print the changed array Unpacking array
for ( int i = 0; i < Arr.size(); ++i) {
cout << Arr[i] << " " ;
}
return 0;
} // This code is contributed by rakeshsahni
|
// Java program for above approach import java.util.*;
class GFG {
// Function for shifting middle element.
static void alternateShift(ArrayList<Integer> arr, int x) {
// get middle index
int mid = arr.size() / 2 ;
// initialize c to 0
int c = 0 ;
// Shift middle element
// till its value not equals to x.
while (arr.get(mid) != x) {
// pop middle element
int z = arr.get(mid);
arr.remove(mid);
// if c is even then insert z
// at start of the array
if (c % 2 == 0 ) {
arr.add( 0 , z);
}
// if c is odd then insert z
// at end of the array
else {
arr.add(z);
}
// increment count c
c++;
}
}
public static void main(String[] args) {
ArrayList<Integer> arr = new ArrayList<>(Arrays.asList( 2 , 8 , 5 , 9 , 10 ));
// initialize a to zero index array value
int a = arr.get( 0 );
// call AlternateShift function
alternateShift(arr, a);
// print the changed array Unpacking array
for ( int i = 0 ; i < arr.size(); ++i) {
System.out.print(arr.get(i) + " " );
}
}
} |
# Function for shifting middle element. def AlternateShift(arr, x):
# get middle index
mid = len (arr) / / 2
# initialize c to 0
c = 0
# Shift middle element
# till its value not equals to x.
while arr[mid] ! = x:
# pop middle element
z = arr.pop(mid)
# if c is even then insert z
# at start of the array
if c % 2 = = 0 :
arr.insert( 0 , z)
# if c is odd then insert z
# at end of the array
else :
arr.append(z)
# increment count c
c + = 1
Arr = [ 2 , 8 , 5 , 9 , 10 ]
# initialize a to zero index array value a = Arr[ 0 ]
# call AlternateShift function AlternateShift(Arr, a) # print the changed array Unpacking array print ( * Arr)
|
<script> // JavaScript program for above approach
// Function for shifting middle element.
const AlternateShift = (arr, x) => {
// get middle index
let mid = parseInt(arr.length / 2);
// initialize c to 0
let c = 0;
// Shift middle element
// till its value not equals to x.
while (arr[mid] != x) {
// pop middle element
let z = arr[mid];
arr.splice(mid, 1);
// if c is even then insert z
// at start of the array
if (c % 2 == 0)
arr.splice(0, 0, z);
// if c is odd then insert z
// at end of the array
else
arr.push(z);
// increment count c
c += 1;
}
}
Arr = [2, 8, 5, 9, 10];
// initialize a to zero index array value
let a = Arr[0];
// call AlternateShift function
AlternateShift(Arr, a);
// print the changed array Unpacking array
for (let i = 0; i < Arr.length; ++i) {
document.write(`${Arr[i]} `);
}
// This code is contributed by rakeshsahni </script> |
// C# program for above approach using System;
using System.Collections.Generic;
using System.Linq;
public class GFG {
// Function for shifting middle element.
static void AlternateShift(List< int > arr, int x)
{
// get middle index
int mid = arr.Count / 2;
// initialize c to 0
int c = 0;
// Shift middle element
// till its value not equals to x.
while (arr[mid] != x) {
// pop middle element
int z = arr[mid];
arr.RemoveAt(mid);
// if c is even then insert z
// at start of the array
if (c % 2 == 0) {
arr.Insert(0, z);
}
// if c is odd then insert z
// at end of the array
else {
arr.Add(z);
}
// increment count c
c++;
}
}
static public void Main()
{
// Code
List< int > arr = new List< int >{ 2, 8, 5, 9, 10 };
// initialize a to zero index array value
int a = arr[0];
// call AlternateShift function
AlternateShift(arr, a);
// print the changed array Unpacking array
for ( int i = 0; i < arr.Count; ++i) {
Console.Write(arr[i] + " " );
}
}
} // This code is contributed by lokesh. |
9 5 2 10 8
Time Complexity: O(n2)
Auxiliary Space: O(1)
Efficient Approach: Alternate Shifting is also the case of half reversal of array. First take an element from last to mid if n is even or take an element from last second to mid and insert into new array br[], then insert the first element into br[]. Then insert element from mid-1 to index 1 and insert into br[]. So it will return the array in half reversal order.
Algorithm :
step1: Declare new array br and initialize pos as n-1.
step2: If n is even traverse from last index pos or if n is odd then traverse from second last index pos-1.
step3: Store element from pos index to mid index into br array.
step4: Then insert first element of array to br array.
step5: If n is odd then insert last value elementof array to br array.
step6: Store element from mid-1 index to index 1 into br array.
step7: return br array.
Below is the implementation of the above algorithm :
// C++ Program of the above approach #include <iostream> using namespace std;
// Function to shift the middle // element to the start and end of // the array alternatively, till // the middle element becomes equal to // the first element of the original Array int * rearrange( int * ar, int n)
{ // creating the array to store
// rearranged value
int * br = new int [n];
// initialising pos to last index
int pos = n - 1;
// if n is odd then we will
// transverse the array
// from second last element
if (n % 2 != 0)
pos = pos - 1;
// storing index of middle element
int mid = n / 2;
// index variable for rearranged array
int c = 0;
// transversing the array from
// the pos to mid index
// and storing it in br[] array
for (; pos >= mid; pos--)
br = ar[pos];
// storing the first element as
// mid value
br = ar[0];
// if n is odd then store
// the last value in br[] the
// transverse till 1st index
if (n % 2 != 0)
br = ar[n - 1];
// storing the first element of
// array as mid value
for (; pos >= 1; pos--)
br = ar[pos];
// returning br[] array
return br;
} // Driver Code int main()
{ int ar[] = { 2, 8, 5, 9, 10 };
int n = sizeof (ar) / sizeof (ar[0]);
// Function Call
int * res = rearrange(ar, n);
// Print answer
for ( int i = 0; i < n; i++)
cout << res[i] << " " ;
} |
// Java Program of the above approach import java.util.*;
class GFG
{ // Function to shift the middle // element to the start and end of // the array alternatively, till // the middle element becomes equal to // the first element of the original Array static int [] rearrange( int [] ar, int n)
{ // creating the array to store
// rearranged value
int [] br = new int [n];
// initialising pos to last index
int pos = n - 1 ;
// if n is odd then we will
// transverse the array
// from second last element
if (n % 2 != 0 )
pos = pos - 1 ;
// storing index of middle element
int mid = n / 2 ;
// index variable for rearranged array
int c = 0 ;
// transversing the array from
// the pos to mid index
// and storing it in br[] array
for (; pos >= mid; pos--)
br = ar[pos];
// storing the first element as
// mid value
br = ar[ 0 ];
// if n is odd then store
// the last value in br[] the
// transverse till 1st index
if (n % 2 != 0 )
br = ar[n - 1 ];
// storing the first element of
// array as mid value
for (; pos >= 1 ; pos--)
br = ar[pos];
// returning br[] array
return br;
} // Driver Code public static void main(String[] args)
{ int ar[] = { 2 , 8 , 5 , 9 , 10 };
int n = ar.length;
// Function Call
int [] res = rearrange(ar, n);
// Print answer
for ( int i = 0 ; i < n; i++)
System.out.print(res[i]+ " " );
} } // This code is contributed by Amit Katiyar |
# Python 3 Program of the above approach # Function to shift the middle # element to the start and end of # the array alternatively, till # the middle element becomes equal to # the first element of the original Array def rearrange(ar, n):
# creating the array to store
# rearranged value
br = [ 0 for i in range (n)]
# initialising pos to last index
pos = n - 1
# if n is odd then we will
# transverse the array
# from second last element
if (n % 2 ! = 0 ):
pos = pos - 1
# storing index of middle element
mid = n / / 2
# index variable for rearranged array
c = 0
# transversing the array from
# the pos to mid index
# and storing it in br[] array
while (pos > = mid):
br = ar[pos]
c + = 1
pos - = 1
# storing the first element as
# mid value
br = ar[ 0 ]
c + = 1
# if n is odd then store
# the last value in br[] the
# transverse till 1st index
if (n % 2 ! = 0 ):
br = ar[n - 1 ]
c + = 1
# storing the first element of
# array as mid value
while (pos > = 1 ):
br = ar[pos]
c + = 1
pos - = 1
# returning br[] array
return br
# Driver Code if __name__ = = '__main__' :
ar = [ 2 , 8 , 5 , 9 , 10 ]
n = len (ar)
# Function Call
res = rearrange(ar, n)
# Print answer
for i in range (n):
print (res[i],end = " " )
# This code is contributed by ipg2016107.
|
// C# Program of the above approach using System;
public class GFG
{ // Function to shift the middle // element to the start and end of // the array alternatively, till // the middle element becomes equal to // the first element of the original Array static int [] rearrange( int [] ar, int n)
{ // creating the array to store
// rearranged value
int [] br = new int [n];
// initialising pos to last index
int pos = n - 1;
// if n is odd then we will
// transverse the array
// from second last element
if (n % 2 != 0)
pos = pos - 1;
// storing index of middle element
int mid = n / 2;
// index variable for rearranged array
int c = 0;
// transversing the array from
// the pos to mid index
// and storing it in br[] array
for (; pos >= mid; pos--)
br = ar[pos];
// storing the first element as
// mid value
br = ar[0];
// if n is odd then store
// the last value in br[] the
// transverse till 1st index
if (n % 2 != 0)
br = ar[n - 1];
// storing the first element of
// array as mid value
for (; pos >= 1; pos--)
br = ar[pos];
// returning br[] array
return br;
} // Driver Code public static void Main(String[] args)
{ int []ar = { 2, 8, 5, 9, 10 };
int n = ar.Length;
// Function Call
int [] res = rearrange(ar, n);
// Print answer
for ( int i = 0; i < n; i++)
Console.Write(res[i]+ " " );
} } // This code is contributed by Amit Katiyar |
<script> // javascript Program of the above approach // Function to shift the middle // element to the start and end of // the array alternatively, till // the middle element becomes equal to // the first element of the original Array function rearrange(ar , n)
{ // creating the array to store
// rearranged value
var br = Array.from({length: n}, (_, i) => 0);
// initialising pos to last index
var pos = n - 1;
// if n is odd then we will
// transverse the array
// from second last element
if (n % 2 != 0)
pos = pos - 1;
// storing index of middle element
var mid = parseInt(n / 2);
// index variable for rearranged array
var c = 0;
// transversing the array from
// the pos to mid index
// and storing it in br array
for (; pos >= mid; pos--)
br = ar[pos];
// storing the first element as
// mid value
br = ar[0];
// if n is odd then store
// the last value in br the
// transverse till 1st index
if (n % 2 != 0)
br = ar[n - 1];
// storing the first element of
// array as mid value
for (; pos >= 1; pos--)
br = ar[pos];
// returning br array
return br;
} // Driver Code var ar = [ 2, 8, 5, 9, 10 ];
var n = ar.length;
// Function Call
var res = rearrange(ar, n);
// Print answer
for ( var i = 0; i < n; i++)
document.write(res[i]+ " " );
// This code is contributed by Princi Singh </script> |
9 5 2 10 8
Time Complexity: O(n)
Space Complexity: O(n)