求取vector中前n个最大值
如果只是需要取出数组中一些最大或最小的元素,可以利用nth_element函数快速定位第k个元素,该函数也支持直接写比较函数,对其他元素并没有排序, 将第n元素放到它该放的位置上,左边元素都大于等于它,右边元素都小于等于它。
- nth_element函数
nth_element的空间复杂度为O(1),在数据量大的时候时间复杂度为O(n),数据少的情况最坏为O(n^2),因为函数原理是随机访问,如果实际数据是随机分布的中,基本都会是O(n)的时间复杂度,效率比全部排序完再取是高很多的。
简单的理解 nth_element() 函数的功能,当采用默认的升序排序规则(std::less)时,该函数可以从某个序列中找到第 n 小的元素 K,并将 K 移动到序列中第 n 的位置处。不仅如此,整个序列经过nth_element() 函数处理后,所有位于 K 之前的元素都比 K 小,所有位于 K 之后的元素都比 K 大。也可以将 nth_element() 函数的排序规则自定义为降序排序。 - code如下
#include<iostream>
#include<algorithm>
#include <vector>
using namespace std;
bool myfunction(int i, int j) {
return (i<j);
}
int main() {
vector<int> vector_1 = { 1,7,9,2,3,2,4,3,3,3,3,0};
int n = 2;
nth_element(vector_1.begin(), vector_1.begin() + n, vector_1.end(), myfunction);
for (int i = 0; i < vector_1.size(); i++)
cout << vector_1[i] << " ";
cout << '\n';
return 0;
}
结果:
myfunction
i<j 为升序,输出结果:0 1 2 2 3 4 3 3 3 3 9 7 即第二小为1,其之后顺序不保证
i>j 为降序,输出结果:9 7 4 2 3 2 1 3 3 3 3 0 即第二大为7,其之后顺序不保证