📌  相关文章
📜  使用C++ STL在线性时间内查找未排序数组的中位数

📅  最后修改于: 2021-05-17 02:16:39             🧑  作者: Mango

给定一个具有N个元素的未排序数组arr [] ,任务是找出线性时间复杂度的数组中位数。

例子:

方法:想法是在C++ STL中使用nth_element()函数。

  1. 如果数组中元素的数量为奇数,请使用nth_element()函数找到第(N / 2)个元素,如下所示,然后索引(N / 2)的值为给定数组的中位数。
  2. 否则,使用nth_element()函数找到第(N / 2)个((N – 1)/ 2)个元素,如下所示,并找到索引(N / 2)和((N – 1) / 2)是给定数组的中位数。

下面是上述方法的实现:

// C++ program for the above approach
  
#include 
using namespace std;
  
// Function for calculating
// the median
double findMedian(vector 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 arr = { 1, 3, 4, 2,
                        7, 5, 8, 6 };
  
    // Function Call
    cout << "Median = "
         << findMedian(arr, arr.size())
         << endl;
    return 0;
}
输出:
Median = 4.5

时间复杂度: O(N)
辅助空间复杂度: O(1)