📅  最后修改于: 2023-12-03 14:49:37.765000             🧑  作者: Mango
程序员们在处理未排序的数组时,有时需要找到其中位数。然而,传统的排序算法需要 $O(nlogn)$ 的时间,但还有一种方法可以在线性时间内解决这个问题:使用 C++ 的 STL(标准模板库)。
具体来说,我们可以使用 nth_element()
函数,该函数可以在 $O(n)$ 时间内将第k大的元素放在正确的位置上。然后,数组的中位数就可以容易地计算出来。
下面是代码示例:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
// 随机生成一个未排序的数组
vector<int> nums = {4, 5, 3, 2, 1, 6, 8, 7};
// 使用nth_element()找到中位数
int mid = nums.size() / 2;
nth_element(nums.begin(), nums.begin() + mid, nums.end()); // 将第mid个元素放在正确位置上
// 计算中位数
int median;
if (nums.size() % 2 == 0) // 如果元素个数为偶数
{
nth_element(nums.begin(), nums.begin() + mid - 1, nums.end()); // 将第mid-1个元素放在正确位置上
median = (nums[mid] + nums[mid - 1]) / 2;
}
else // 如果元素个数为奇数
{
median = nums[mid];
}
// 输出结果
cout << "中位数是:" << median << endl;
return 0;
}
这个程序使用了 vector 存储了一个未排序的数组。在 nth_element()
函数中,我们使用 nums.begin() + mid
参数找到了第 mid 大的元素,并将其放在了正确的位置上。
接着,我们计算中位数。如果元素个数为偶数,我们需要将第 mid - 1 大的元素也放在正确的位置上,并计算两个中间元素的平均值。如果元素个数为奇数,则中位数为第 mid 大的元素。
最后,我们输出了中位数。
这个程序的时间复杂度为 $O(n)$,比常规排序算法的 $O(nlogn)$ 更快。