头文件:
#include<algorithm>
using namespace std;
函数原型:
void nth_element( RandomIt first, RandomIt nth, RandomIt last,Compare comp );
first, last - 定义待排序范围的随机访问迭代器
nth - 定义排序划分点的随机访问迭代器
comp - 比较函数对象(即满足比较 (Compare) 概念的对象),若第一参数小于(即先序于)第二参数则返回 true 。
比较函数的签名应等价于如下:
bool cmp(const Type1 &a, const Type2 &b);
虽然签名不必有 const & ,函数也不能修改传递给它的对象,而且必须接受(可为 const 的)类型 Type1
函数功能:
nth_element 是部分排序算法,它重排 [ first,last ) 中元素,使得:
- nth 所指向的元素被更改为假如 [first, last) 已排序 (默认从小到大) 则该位置会出现的元素。
- 这个新的 nth 元素前的所有元素小于或等于新的 nth 元素后的所有元素。
时间复杂度:O(N)
具体应用:
①找到 [ first,last )中第k小的元素(并将其放在第k个位置上)
nth_element(v.begin(),v.begin()+k-1,v.end()); //v.begin()+k-1为第k个位置
cout<<"第k小的元素为:"<<v[k-1]; //数组下标从0开始
如下:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
vector<int> v;
for(int i=1;i<=9;i++)
v.push_back(i);
random_shuffle(v.begin(),v.end());
cout<<"原序列:";
for(int i=0;i<v.size();i++)
cout<<v[i]<<" ";
nth_element(v.begin(),v.begin()+2,v.end());
cout<<endl<<endl<<"第3小的元素是:"<<v[2];
return 0;
}
输出:
原序列:9 2 7 3 1 6 8 4 5
第3小的元素是:3
②找到 [ first,last )中第k大的元素(并将其放在第k个位置上)
nth_element(v.begin(),v.begin()+k-1,v.end(),greater<int>() );
cout<<"第k大的元素为:"<<v[k-1];