Sort all even numbers in ascending order and then sort all odd numbers in descending order

Given an array of integers (both odd and even), sort them in such a way that the first part of the array contains odd numbers sorted in descending order, rest portion contains even numbers sorted in ascending order.

Examples:

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

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

Asked in : Microsoft

Recommended: Please solve it on “PRACTICE ” first, before moving on to the solution.

Method 1 (Using Partition)

1. Partition the input array such that all odd elements are moved to left and all even elements on right. This step takes O(n).
2. Once the array is partitioned, sort left and right parts individually. This step takes O(n Log n).

Below is implementation of above idea.

C++

 // C++ program sort array in even and odd manner. // The odd numbers are to be sorted in descending // order and the even numbers in ascending order #include using namespace std;    // To do two way sort. First sort even numbers in // ascending order, then odd numbers in descending // order. void twoWaySort(int arr[], int n) {     // Current indexes from left and right     int l = 0, r = n - 1;        // Count of odd numbers     int k = 0;        while (l < r) {         // Find first odd number from left side.         while (arr[l] % 2 != 0) {             l++;             k++;         }            // Find first even number from right side.         while (arr[r] % 2 == 0 && l < r)             r--;            // Swap odd number present on left and even         // number right.         if (l < r)             swap(arr[l], arr[r]);     }        // Sort odd number in descending order     sort(arr, arr + k, greater());        // Sort even number in ascending order     sort(arr + k, arr + n); }    // Driver code int main() {     int arr[] = { 1, 3, 2, 7, 5, 4 };     int n = sizeof(arr) / sizeof(int);     twoWaySort(arr, n);     for (int i = 0; i < n; i++)         cout << arr[i] << " ";     return 0; }

Java

 // Java program sort array in even and odd manner. // The odd numbers are to be sorted in descending // order and the even numbers in ascending order    import java.util.Arrays; import java.util.Collections;    public class GFG {     // To do two way sort. First sort even numbers in     // ascending order, then odd numbers in descending     // order.     static void twoWaySort(Integer arr[], int n)     {         // Current indexes from left and right         int l = 0, r = n - 1;            // Count of odd numbers         int k = 0;            while (l < r) {             // Find first odd number from left side.             while (arr[l] % 2 != 0) {                 l++;                 k++;             }                // Find first even number from right side.             while (arr[r] % 2 == 0 && l < r)                 r--;                // Swap odd number present on left and even             // number right.             if (l < r) {                 // swap arr[l] arr[r]                 int temp = arr[l];                 arr[l] = arr[r];                 arr[r] = temp;             }         }            // Sort odd number in descending order         Arrays.sort(arr, 0, k, Collections.reverseOrder());            // Sort even number in ascending order         Arrays.sort(arr, k, n);     }        // Driver Method     public static void main(String[] args)     {         Integer arr[] = { 1, 3, 2, 7, 5, 4 };            twoWaySort(arr, arr.length);            System.out.println(Arrays.toString(arr));     } }

Python

 # Python program to sort array  # in even and odd manner  # The odd numbers are to be  # sorted in descending order  # and the even numbers in  # ascending order    # To do two way sort. First  # sort even numbers in ascending # order, then odd numbers in  # descending order. def two_way_sort(arr, arr_len):            # Current indexes l->left     # and r->right     l, r = 0, arr_len - 1            # Count of number of      # odd numbers, used in     # slicing the array later.     k = 0            # Run till left(l) < right(r)     while(l < r):                    # While left(l) is odd, if yes         # increment the left(l) plus          # odd count(k) if not break the         # while for even number found          # here to be swaped         while(arr[l] % 2 != 0):             l += 1             k += 1                        # While right(r) is even,          # if yes decrement right(r)         # if not break the while for          # odd number found here to         # be swaped              while(arr[r] % 2 == 0 and l < r):             r -= 1                        # Swap the left(l) and right(r),          # which is even and odd numbers          # encountered in above loops         if(l < r):             arr[l], arr[r] = arr[r], arr[l]                    # Slice the number on the     # basis of odd count(k)     odd = arr[:k]     even = arr[k:]            # Sort the odd and      # even array accordingly     odd.sort(reverse = True)     even.sort()            # Extend the odd array with      # even values and return it.     odd.extend(even)            return odd        # Driver code arr_len = 6 arr = [1, 3, 2, 7, 5, 4] result = two_way_sort(arr, arr_len) for i in result:     print(str(i) + " "),    # This code is contributed  # by JaySiyaRam

C#

 // C# program sort array in even and odd manner. // The odd numbers are to be sorted in descending // order and the even numbers in ascending order using System; using System.Linq;    class GFG {     // To do two way sort. First sort even numbers in     // ascending order, then odd numbers in descending     // order.     static void twoWaySort(int[] arr, int n)     {         // Current indexes from left and right         int l = 0, r = n - 1;            // Count of odd numbers         int k = 0;            while (l < r) {             // Find first odd number from left side.             while (arr[l] % 2 != 0) {                 l++;                 k++;             }                // Find first even number from right side.             while (arr[r] % 2 == 0 && l < r)                 r--;                // Swap odd number present on left and even             // number right.             if (l < r) {                 // swap arr[l] arr[r]                 int temp = arr[l];                 arr[l] = arr[r];                 arr[r] = temp;             }         }            // Sort odd number in descending order         Array.Sort(arr, 0, k);         Array.Reverse(arr, 0, k);            // Sort even number in ascending order         Array.Sort(arr, k, n - k);     }        // Driver Method     public static void Main(String[] args)     {         int[] arr = { 1, 3, 2, 7, 5, 4 };            twoWaySort(arr, arr.Length);            Console.WriteLine(String.Join(" ", arr));     } }    // This code has been contributed by 29AjayKumar

Output:

7 5 3 1 2 4

Time complexity: O(n log n)
space complexity: O(1)

Method 2 (Using negative multiplication) :

1. Make all odd numbers negative.
2. Sort all numbers.
3. Revert the changes made in step 1 to get original elements back.

C++

 // C++ program sort array in even and odd manner. // The odd numbers are to be sorted in descending // order and the even numbers in ascending order #include using namespace std;    // To do two way sort. First sort even numbers in // ascending order, then odd numbers in descending // order. void twoWaySort(int arr[], int n) {     // Make all odd numbers negative     for (int i = 0; i < n; i++)         if (arr[i] & 1) // Check for odd             arr[i] *= -1;        // Sort all numbers     sort(arr, arr + n);        // Retaining original array     for (int i = 0; i < n; i++)         if (arr[i] & 1)             arr[i] *= -1; }    // Driver code int main() {     int arr[] = { 1, 3, 2, 7, 5, 4 };     int n = sizeof(arr) / sizeof(int);     twoWaySort(arr, n);     for (int i = 0; i < n; i++)         cout << arr[i] << " ";     return 0; }

Java

 // Java program sort array in even and odd manner. // The odd numbers are to be sorted in descending // order and the even numbers in ascending order    import java.util.Arrays;    public class GFG {     // To do two way sort. First sort even numbers in     // ascending order, then odd numbers in descending     // order.     static void twoWaySort(int arr[], int n)     {         // Make all odd numbers negative         for (int i = 0; i < n; i++)             if ((arr[i] & 1) != 0) // Check for odd                 arr[i] *= -1;            // Sort all numbers         Arrays.sort(arr);            // Retaining original array         for (int i = 0; i < n; i++)             if ((arr[i] & 1) != 0)                 arr[i] *= -1;     }        // Driver Method     public static void main(String[] args)     {         int arr[] = { 1, 3, 2, 7, 5, 4 };            twoWaySort(arr, arr.length);            System.out.println(Arrays.toString(arr));     } }

Python3

 # Python 3 program to sort array in  # even and odd manner. The odd # numkbers are to be sorted in  # descending order and the even  # numbers in ascending order    # To do two way sort. First sort  # even numbers in ascending order, # then odd numbers in descending order. def twoWaySort(arr, n):        # Make all odd numbers negative     for i in range(0, n):                    # Check for odd         if (arr[i] & 1):              arr[i] *= -1        # Sort all numbers     arr.sort()        # Retaining original array     for i in range(0, n):         if (arr[i] & 1):             arr[i] *= -1    # Driver code arr = [1, 3, 2, 7, 5, 4] n = len(arr) twoWaySort(arr, n); for i in range(0, n):     print(arr[i], end = " ")        # This code is contributed by Smitha Dinesh Semwal

C#

 // Java program sort array in even and // odd manner. The odd numbers are to // be sorted in descending order and // the even numbers in ascending order using System;    public class GFG {        // To do two way sort. First sort     // even numbers in ascending order,     // then odd numbers in descending     // order.     static void twoWaySort(int[] arr, int n)     {            // Make all odd numbers negative         for (int i = 0; i < n; i++)                // Check for odd             if ((arr[i] & 1) != 0)                 arr[i] *= -1;            // Sort all numbers         Array.Sort(arr);            // Retaining original array         for (int i = 0; i < n; i++)             if ((arr[i] & 1) != 0)                 arr[i] *= -1;     }        // Driver Method     public static void Main()     {         int[] arr = { 1, 3, 2, 7, 5, 4 };            twoWaySort(arr, arr.Length);            for (int i = 0; i < arr.Length; i++)             Console.Write(arr[i] + " ");     } }    // This code is contributed by Smitha

PHP



Output:

7 5 3 1 2 4

Time complexity: O(n log n)
Space complexity: O(1)

This method may not work when input array contains negative numbers. However, there is a way to handle this. We count the positive odd integers in the input array then sort again. Readers may refer this for implementation.

Method 3 (Using comparator):
This problem can be easily solved by using the inbuilt sort function with a custom compare method. On comparing any two elements there will be three cases:

1. When both the elements are even: In this case, the smaller element must appear in the left of the larger element in the sorted array.
2. When both the elements are odd: The larger element must appear on left of the smaller element.
3. One is odd and the other is even: The element which is odd must appear on the left of the even element.

Below is the implementation of the above approach:

 // C++ implementation of the approach #include using namespace std;    // Utility function to print // the contents of the array void printArr(int arr[], int n) {     for (int i = 0; i < n; i++)         cout << arr[i] << " "; }    // To do two way sort. Make comparator function // for the inbuilt sort function of c++ such that // odd numbers are placed before even in descending // and ascending order respectively bool compare(int a, int b) {     // If both numbers are even, smaller number should     // be placed at lower index     if (a % 2 == 0 && b % 2 == 0)         return a < b;        // If both numbers are odd larger number     // should be placed at lower index     if (a % 2 != 0 && b % 2 != 0)         return b < a;        // If a is odd and b is even, a should be placed before b     if (a % 2 != 0)         return true;        // If b is odd and a is even, b should be placed before a     return false; }    // Driver code int main() {     int arr[] = { 1, 3, 2, 7, 5, 4 };     int n = sizeof(arr) / sizeof(int);        // Sort the array     sort(arr, arr + n, compare);        // Print the sorted array     printArr(arr, n);        return 0; }    // This code is contributed by Nikhil Yadav

Thanks to Amandeep Singh for suggesting this solution.

This article is contributed by DANISH_RAZA. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.

My Personal Notes arrow_drop_up

Article Tags :

5

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.