Related Articles
Partition the array into two odd length groups with minimized absolute difference between their median
• Difficulty Level : Medium
• Last Updated : 03 Mar, 2020

Given an array arr[] of positive integers of even length, the task is to partition these elements of arr[] into two groups each of odd length such that the absolute difference between the median of the two groups is minimized.

Examples:

Input: arr[] = { 1, 2, 3, 4, 5, 6 }
Output: 1
Explanation:
Group 1 can be [2, 4, 6] with median 4
Group 2 can be [1, 3, 5] with median 3.
The absolute difference between the two medians is 4 – 3 = 1, which can’t be minimized further with any kind of groupings formed.

Input: arr[] = { 15, 25, 35, 50 }
Output: 10
Explanation:
Group 1 can be [15, 25, 50] with median 25
Group 2 can be  with median 35.
The absolute difference between the two medians is 35 – 25 = 10, which can’t be minimized further with any kind of groupings formed.

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Approach:

• If the given array arr[] is sorted, the middle elements of arr[] will give the minimum difference.
• So divide the arr[] in such a way that these two elements will be the median of two new arrays of odd length.
• Therefore, put the n/2th element of the arr[] in the first group and the (n/2 – 1)th element of the arr[] in the second group as a median respectively.
• Then abs(arr[n/2] – arr[(n/2)-1]) is the minimum difference between the two new arrays.

Below is the implementation of the above approach:

## C++

 `// C++ program to minimise the``// median between partition array`` ` `#include "bits/stdc++.h"``using` `namespace` `std;`` ` `// Function to find minimise the``// median between partition array``int` `minimiseMedian(``int` `arr[], ``int` `n)``{``    ``// Sort the given array arr[]``    ``sort(arr, arr + n);`` ` `    ``// Return the difference of two``    ``// middle element of the arr[]``    ``return` `abs``(arr[n / 2] - arr[(n / 2) - 1]);``}`` ` `// Driver Code``int` `main()``{``    ``int` `arr[] = { 15, 25, 35, 50 };`` ` `    ``// Size of arr[]``    ``int` `n = ``sizeof``(arr) / ``sizeof``(arr);`` ` `    ``// Function that returns the minimum``    ``// the absolute difference between``    ``// median of partition array``    ``cout << minimiseMedian(arr, n);``    ``return` `0;``}`

## Java

 `// Java program to minimise the ``// median between partition array``import` `java.util.*;`` ` `class` `GFG ``{`` ` `    ``// Function to find minimise the ``    ``// median between partition array ``    ``static` `int` `minimiseMedian(``int` `arr[], ``int` `n) ``    ``{ ``        ``// Sort the given array arr[] ``        ``Arrays.sort(arr); ``     ` `        ``// Return the difference of two ``        ``// middle element of the arr[] ``        ``return` `Math.abs(arr[n / ``2``] - arr[(n / ``2``) - ``1``]); ``    ``} ``     ` `    ``// Driver Code ``    ``public` `static` `void` `main (String[] args) ``    ``{ ``        ``int` `arr[] = { ``15``, ``25``, ``35``, ``50` `}; ``     ` `        ``// Size of arr[] ``        ``int` `n = arr.length; ``     ` `        ``// Function that returns the minimum ``        ``// the absolute difference between ``        ``// median of partition array ``        ``System.out.println(minimiseMedian(arr, n)); ``    ``} ``}`` ` `// This code is contributed by AnkitRai01`

## Python3

 `# Python3 program to minimise the ``# median between partition array `` ` `# Function to find minimise the ``# median between partition array ``def` `minimiseMedian(arr, n) : `` ` `    ``# Sort the given array arr[] ``    ``arr.sort();``     ` `    ``# Return the difference of two``    ``# middle element of the arr[]``    ``ans ``=` `abs``(arr[n ``/``/` `2``] ``-` `arr[(n ``/``/` `2``) ``-` `1``]);``     ` `    ``return` `ans; `` ` `# Driver Code ``if` `__name__ ``=``=` `"__main__"` `: `` ` `    ``arr ``=` `[ ``15``, ``25``, ``35``, ``50` `]; `` ` `    ``# Size of arr[] ``    ``n ``=` `len``(arr); `` ` `    ``# Function that returns the minimum ``    ``# the absolute difference between ``    ``# median of partition array ``    ``print``(minimiseMedian(arr, n)); ``     ` `# This code is contributed by AnkitRai01`

## C#

 `// C# program to minimise the ``// median between partition array``using` `System;`` ` `class` `GFG ``{`` ` `    ``// Function to find minimise the ``    ``// median between partition array ``    ``static` `int` `minimiseMedian(``int` `[]arr, ``int` `n) ``    ``{ ``        ``// Sort the given array []arr ``        ``Array.Sort(arr); ``     ` `        ``// Return the difference of two ``        ``// middle element of the []arr ``        ``return` `Math.Abs(arr[n / 2] - arr[(n / 2) - 1]); ``    ``} ``     ` `    ``// Driver Code ``    ``public` `static` `void` `Main(String[] args) ``    ``{ ``        ``int` `[]arr = { 15, 25, 35, 50 }; ``     ` `        ``// Size of []arr ``        ``int` `n = arr.Length; ``     ` `        ``// Function that returns the minimum ``        ``// the absolute difference between ``        ``// median of partition array ``        ``Console.WriteLine(minimiseMedian(arr, n)); ``    ``} ``}`` ` `// This code is contributed by 29AjayKumar`
Output:
```10
```

Time Complexity: O(N*log N)

Attention reader! Don’t stop learning now. Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price. To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

My Personal Notes arrow_drop_up