📅  最后修改于: 2023-12-03 14:49:48.025000             🧑  作者: Mango
中位数是一个未排序数组中间的值。如果数组大小为偶数,则中位数为中间两个值的平均值。传统上,查找未排序数组的中位数需要使用排序算法,其时间复杂度为O(nlogn)。但是,可以使用C++ STL中的nth_element函数在O(n)的时间复杂度内找到中位数。
nth_element是STL中的一个函数,其作用是将第n个元素放在数组中正确的位置上,同时保证在该元素左侧的元素小于该元素,在该元素右侧的元素大于该元素。这个算法被称为nth_element,它的时间复杂度为O(n)。
为了找到未排序数组的中位数,我们可以使用nth_element函数将数组的中间元素放到正确的位置上。对于奇数长度的数组,中间元素即为中位数;对于偶数长度的数组,中间两个元素的平均值即为中位数。
下面是一个寻找中位数的例子:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> nums = {5, 2, 4, 6, 1, 3};
int n = nums.size();
nth_element(nums.begin(), nums.begin() + n / 2, nums.end());
int median;
if (n % 2 == 0) {
int a = nums[n / 2];
nth_element(nums.begin(), nums.begin() + n / 2 - 1, nums.end());
int b = nums[n / 2 - 1];
median = (a + b) / 2;
} else {
median = nums[n / 2];
}
cout << "The median is: " << median << endl;
return 0;
}
在上面的代码中,我们使用一个vector来存储待查找的数组,然后使用nth_element函数将中位数对应的元素放到正确的位置上。最后,对于奇数长度的数组,中位数就是该位置的元素;对于偶数长度的数组,我们需要再使用一次nth_element函数找到中间两个元素,然后计算它们的平均值。
在C++ STL中,nth_element函数提供了在线性时间内查找未排序数组中第n个元素的功能。通过使用该函数,我们可以轻松地找到未排序数组的中位数,其时间复杂度为O(n)。