nth_element()函数是STL中的一个函数, 在algorithm头文件中, 作用是给容器的第k个元素排序.
没错, 就是给一个元素排序, 可以到第k个元素是什么, 时间复杂度为O(n)
函数模板
template< class _RanIt> void nth_element(_RanIt _First, _RanIt _Nth, _RanIt _Last);
也即是
nth_element(first, nth, last);
普通使用方法
void nth()
{
int a[7] = {12, -33, 78, 2, 776, 374, -3};
nth_element(a, a + 3, a+7); //中间的a + i为给a[i]排序
cout << a[3];
}
如果想给整个容器排序的话, 依次给每个元素排序. 不推荐
void nth()
{
int a[7] = {12, -33, 78, 2, 776, 374, -3};
for(int i = 0; i < 7; ++i) {
nth_element(a, a+i, a+7);
cout << a[i] << ' ';
}
}
看一段已排序序列的nth_element()
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for(int j = 0; j < 10; ++j) {
nth_element(a, a+j, a+10);
for(int i = 0; i < 10; ++i)
cout << a[i] << ' ';
cout << endl << endl;
}
}
希望从中可以找出排序规则, 但是显然找不出…
百度了它的源码, 很复杂, 目前还看不懂…
默认的排序规则是升序, 但是规则是可以自定义的
同其他STL一样, 加个cmp函数
bool cmp(int a, int b)
{
return a > b;
}
int main()
{
int a[7] = {12, -33, 78, 2, 776, 374, -3};
for(int i = 0; i < 7; ++i) {
nth_element(a, a + i, a + 7, cmp);
cout << a[i] << ' ';
}
}
因为时间复杂度只有O(n), 所以只要得到第k个元素时, 不必给整个容器排序, 效率较高