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

📅  最后修改于: 2021-09-05 11:43:44             🧑  作者: 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)

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live