Open In App

# Rearrange array such that arr[i] >= arr[j] if i is even and arr[i]<=arr[j] if i is odd and j < i

Given an array of n elements. Our task is to write a program to rearrange the array such that elements at even positions are greater than all elements before it and elements at odd positions are less than all elements before it.
Examples:

Input : arr[] = {1, 2, 3, 4, 5, 6, 7}
Output : 4 5 3 6 2 7 1

Input : arr[] = {1, 2, 1, 4, 5, 6, 8, 8}
Output : 4 5 2 6 1 8 1 8

The idea to solve this problem is to first create an additional copy of the original array and sort the copied array. Now the total number of even positions in an array with n elements will be floor(n/2) and the remaining is the number of odd positions. Now fill the odd and even positions in the original array using the sorted array in a below manner:

• Total odd positions will be n – floor(n/2). Start from (n-floor(n/2))th position in the sorted array and copy the element to the 1st position of the sorted array. Start traversing the sorted array from this position towards the left and keep filling the odd positions in the original array towards the right.
• Start traversing the sorted array starting from (n-floor(n/2)+1)th position towards the right and keep filling the original array starting from the 2nd position.

Below is the implementation of above idea:

## C++

 // C++ program to rearrange the array as per the given// condition #include using namespace std; // function to rearrange the arrayvoid rearrangeArr(int arr[], int n){    // total even positions    int evenPos = n / 2;    // total odd positions    int oddPos = n - evenPos;    int tempArr[n];       // copy original array in an auxiliary array    for (int i = 0; i < n; i++)        tempArr[i] = arr[i];     // sort the auxiliary array    sort(tempArr, tempArr + n);    int j = oddPos - 1;     // fill up odd position in original array    for (int i = 0; i < n; i += 2)        arr[i] = tempArr[j--];     j = oddPos;     // fill up even positions in original array    for (int i = 1; i < n; i += 2)        arr[i] = tempArr[j++];     // display array    for (int i = 0; i < n; i++)        cout << arr[i] << " ";} // Driver codeint main(){    int arr[] = { 1, 2, 3, 4, 5, 6, 7 };    int size = sizeof(arr) / sizeof(arr[0]);    rearrangeArr(arr, size);    return 0;}

## C

 // C program to rearrange the array as per the given// condition#include #include  // Compare function for qsortint cmpfunc(const void* a, const void* b){    return (*(int*)a - *(int*)b);} // function to rearrange the arrayvoid rearrangeArr(int arr[], int n){    // total even positions    int evenPos = n / 2;    // total odd positions    int oddPos = n - evenPos;    int tempArr[n];     // copy original array in an auxiliary array    for (int i = 0; i < n; i++)        tempArr[i] = arr[i];     // sort the auxiliary array    qsort(tempArr, n, sizeof(int), cmpfunc);    int j = oddPos - 1;     // fill up odd position in original array    for (int i = 0; i < n; i += 2)        arr[i] = tempArr[j--];     j = oddPos;     // fill up even positions in original array    for (int i = 1; i < n; i += 2)        arr[i] = tempArr[j++];     // display array    for (int i = 0; i < n; i++)        printf("%d ", arr[i]);} // Driver codeint main(){    int arr[] = { 1, 2, 3, 4, 5, 6, 7 };    int size = sizeof(arr) / sizeof(arr[0]);    rearrangeArr(arr, size);    return 0;} // This code is contributed by Sania Kumari Gupta

## Java

 // Java program to rearrange the array// as per the given conditionimport java.util.*;import java.lang.*; public class GfG{    // function to rearrange the array    public static void rearrangeArr(int arr[],                                        int n)    {        // total even positions        int evenPos = n / 2;         // total odd positions        int oddPos = n - evenPos;         int[] tempArr = new int [n];         // copy original array in an        // auxiliary array        for (int i = 0; i < n; i++)            tempArr[i] = arr[i];         // sort the auxiliary array        Arrays.sort(tempArr);         int j = oddPos - 1;         // fill up odd position in        // original array        for (int i = 0; i < n; i += 2) {            arr[i] = tempArr[j];            j--;        }         j = oddPos;         // fill up even positions in        // original array        for (int i = 1; i < n; i += 2) {            arr[i] = tempArr[j];            j++;        }         // display array        for (int i = 0; i < n; i++)            System.out.print(arr[i] + " ");    }         // Driver function    public static void main(String argc[]){        int[] arr = new int []{ 1, 2, 3, 4, 5,                                        6, 7 };        int size = 7;        rearrangeArr(arr, size);             }} /* This code is contributed by Sagar Shukla */

## Python3

 # Python3 code to rearrange the array# as per the given conditionimport array as aimport numpy as np # function to rearrange the arraydef rearrangeArr(arr, n):         # total even positions    evenPos = int(n / 2)     # total odd positions    oddPos = n - evenPos     # initialising empty array in python    tempArr = np.empty(n, dtype = object)     # copy original array in an    # auxiliary array    for i in range(0, n):                 tempArr[i] = arr[i]     # sort the auxiliary array    tempArr.sort()     j = oddPos - 1     # fill up odd position in original    # array    for i in range(0, n, 2):         arr[i] = tempArr[j]        j = j - 1         j = oddPos     # fill up even positions in original    # array    for i in range(1, n, 2):        arr[i] = tempArr[j]        j = j + 1         # display array    for i in range(0, n):        print (arr[i], end = ' ') # Driver codearr = a.array('i', [ 1, 2, 3, 4, 5, 6, 7 ])rearrangeArr(arr, 7) # This code is contributed by saloni1297

## C#

 // C# program to rearrange the array// as per the given conditionusing System; public class GfG {         // Function to rearrange the array    public static void rearrangeArr(int []arr, int n)    {        // total even positions        int evenPos = n / 2;         // total odd positions        int oddPos = n - evenPos;         int[] tempArr = new int [n];         // copy original array in an        // auxiliary array        for (int i = 0; i < n; i++)            tempArr[i] = arr[i];         // sort the auxiliary array        Array.Sort(tempArr);         int j = oddPos - 1;         // Fill up odd position in        // original array        for (int i = 0; i < n; i += 2) {            arr[i] = tempArr[j];            j--;        }         j = oddPos;         // Fill up even positions in        // original array        for (int i = 1; i < n; i += 2) {            arr[i] = tempArr[j];            j++;        }         // display array        for (int i = 0; i < n; i++)            Console.Write(arr[i] + " ");    }         // Driver Code    public static void Main()    {        int[] arr = new int []{ 1, 2, 3, 4, 5, 6, 7 };        int size = 7;        rearrangeArr(arr, size);    }} /* This code is contributed by vt_m */



## Javascript



Output

4 5 3 6 2 7 1

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

Another Approach-

We can traverse the array by defining two variables p and q and assign values from last.

if even index is there, we will give it max value otherwise min value.

p =0 and q= end;

p will go ahead and q will decrease.

## C++

 #include using namespace std; int main(){    int n,i,p,q;    int a[]= {1, 2, 1, 4, 5, 6, 8, 8};    n=sizeof(a)/sizeof(a[0]);    int b[n];    for(i=0;i=0;i--){            if(i%2!=0){            a[i]=b[q];            q--;            }            else{                a[i]=b[p];                p++;            }    }    for(i=0;i

## Java

 import java.util.*; class GFG{   public static void main(String[] args)  {    int n, i, j, p, q;    int a[] = {1, 2, 1, 4, 5, 6, 8, 8};    n = a.length;    int []b = new int[n];    for(i = 0; i < n; i++)      b[i] = a[i];     Arrays.sort(b);    p = 0; q = n - 1;    for(i = n - 1; i >= 0; i--)    {      if(i % 2 != 0)      {        a[i] = b[q];        q--;      }      else{        a[i] = b[p];        p++;      }    }    for(i = 0; i < n; i++)    {      System.out.print(a[i]+" ");    }  }} // This code is contributed by gauravrajput1

## Python3

 if __name__ == '__main__':    #n, i, j, p, q;    a = [ 1, 2, 1, 4, 5, 6, 8, 8 ];    n = len(a);    b = [0]*n;    for i in range(n):        b[i] = a[i];     b.sort();    p = 0;    q = n - 1;    for i in range(n-1, -1,-1):        if (i % 2 != 0):            a[i] = b[q];            q -= 1;        else:            a[i] = b[p];            p += 1;             for i in range(n):        print(a[i], end=" ");     # This code is contributed by gauravrajput1

## C#

 using System;  public class GFG{   public static void Main(String[] args)  {    int n, i, j, p, q;    int []a = {1, 2, 1, 4, 5, 6, 8, 8};    n = a.Length;    int []b = new int[n];    for(i = 0; i < n; i++)      b[i] = a[i];     Array.Sort(b);    p = 0; q = n - 1;    for(i = n - 1; i >= 0; i--)    {      if(i % 2 != 0)      {        a[i] = b[q];        q--;      }      else{        a[i] = b[p];        p++;      }    }    for(i = 0; i < n; i++)    {      Console.Write(a[i]+" ");    }  }} // This code is contributed by gauravrajput1

## Javascript



Output

4 5 2 6 1 8 1 8

Time Complexity: O(n log n), The maximum time taken to sort the array.
Auxiliary Space: O(n), The extra space is required to store the copy of elements of original array.

This algorithm will take 1 for loop less than the previous one.