Related Articles

# Rearrange the Array by shifting middle elements to start and end alternatively

• Difficulty Level : Medium
• Last Updated : 21 Sep, 2021

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++

 `// C++ program for above approach``#include ``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;` `    ``// 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`

## Python3

 `# 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)`

## Javascript

 ``
Output
`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++

 `// C++ Program of the above approach``#include ``using` `namespace` `std;` `// Function to 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;` `    ``// 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);` `    ``// Function Call``    ``int``* res = rearrange(ar, n);` `    ``// Print answer``    ``for` `(``int` `i = 0; i < n; i++)``        ``cout << res[i] << ``" "``;``}`

## Java

 `// Java Program of the above approach``import` `java.util.*;` `class` `GFG``{` `// Function to 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`

## Python3

 `# Python 3 Program of the above approach` `# Function to 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#

 `// C# Program of the above approach``using` `System;` `public` `class` `GFG``{` `// Function to 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;` `    ``// 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`

## Javascript

 ``
Output
`9 5 2 10 8 `

Time Complexity: O(n)
Space Complexity: O(n)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.

My Personal Notes arrow_drop_up