# Finding Median of unsorted Array in linear time using C++ STL

Given an unsorted array arr[] having N elements, the task is to find out the median of the array in linear time complexity.

Examples:

Input: N = 5, arr[] = {4, 1, 2, 6, 5}
Output: 4
Explanation:
Since N = 5, which is odd, therefore the median is the 3rd element in the sorted array.
The 3rd element in the sorted arr[] is 4.
Hence the median is 4.

Input: N = 8, arr[] = {1, 3, 4, 2, 6, 5, 8, 7}
Output: 4.5
Explanation:
Since N = 8, which is even, therefore median is the average of 4th and 5th element in the sorted array.
The 4th and 5th element in the sorted array is 4 and 5 respectively.
Hence the median is (4+5)/2 = 4.5.

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

Approach: The idea is to use nth_element() function in C++ STL.

1. If the number of element in the array is odd, then find the (N/2)th element using nth_element() function as illustrated below and then the value at index (N/2) is the median of the given array.

nth_element(arr.begin(), arr.begin() + N/2, arr.end())

2. Else find the (N/2)th and ((N – 1)/2)th element using nth_element() function as illustrated below and find the average of the values at index (N/2) and ((N – 1)/2) is the median of the given array.

nth_element(arr.begin(), arr.begin() + N/2, arr.end())
nth_element(arr.begin(), arr.begin() + (N – 1)/2, arr.end())

Below is the implementation of the above approach:

 `// C++ program for the above approach ` ` `  `#include ` `using` `namespace` `std; ` ` `  `// Function for calculating ` `// the median ` `double` `findMedian(vector<``int``> a, ` `                  ``int` `n) ` `{ ` ` `  `    ``// If size of the arr[] is even ` `    ``if` `(n % 2 == 0) { ` ` `  `        ``// Applying nth_element ` `        ``// on n/2th index ` `        ``nth_element(a.begin(), ` `                    ``a.begin() + n / 2, ` `                    ``a.end()); ` ` `  `        ``// Applying nth_element ` `        ``// on (n-1)/2 th index ` `        ``nth_element(a.begin(), ` `                    ``a.begin() + (n - 1) / 2, ` `                    ``a.end()); ` ` `  `        ``// Find the average of value at ` `        ``// index N/2 and (N-1)/2 ` `        ``return` `(``double``)(a[(n - 1) / 2] ` `                        ``+ a[n / 2]) ` `               ``/ 2.0; ` `    ``} ` ` `  `    ``// If size of the arr[] is odd ` `    ``else` `{ ` ` `  `        ``// Applying nth_element ` `        ``// on n/2 ` `        ``nth_element(a.begin(), ` `                    ``a.begin() + n / 2, ` `                    ``a.end()); ` ` `  `        ``// Value at index (N/2)th ` `        ``// is the median ` `        ``return` `(``double``)a[n / 2]; ` `    ``} ` `} ` ` `  `// Driver Code ` `int` `main() ` `{ ` `    ``// Given array arr[] ` `    ``vector<``int``> arr = { 1, 3, 4, 2, ` `                        ``7, 5, 8, 6 }; ` ` `  `    ``// Function Call ` `    ``cout << ``"Median = "` `         ``<< findMedian(arr, arr.size()) ` `         ``<< endl; ` `    ``return` `0; ` `} `

Output:

```Median = 4.5
```

Time Complexity: O(N)
Auxiliary Space Complexity: O(1) My Personal Notes arrow_drop_up Check out this Author's contributed articles.

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 Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.

Improved By : nidhi_biet

4

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