今天学习到STL中的nth_element,她是一个默认能求第k小的数的方法,需要的头文件为algorithm。
默认为:nth_element(start, start+n, end)
使第n大元素处于第n位置(从0开始,其位置是下标为n的元素),并且比这个元素小的元素都排在这个元素之前,比这个元素大的元素都排在这个元素之后,但不能保证他们是有序的。
#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std; int main()
{
int n,k;
int a[];
while(scanf("%d %d",&n, &k) == )
{
for(int i=; i<n; i++)
scanf("%d",&a[i]);
nth_element(a,a+k-,a+n);
printf("%d\n",a[k-]);
for(int i=; i<n; i++)
printf("%d ",a[i]);
printf("\n");
}
return ;
}
当然,你还可以求第K大的数,方法即是添加一个greater<int>()参数,
#include <stdio.h>
#include <algorithm>
#include <iostream>//这里需要添加iostream
using namespace std; int main()
{
int n,k;
int a[];
while(scanf("%d %d",&n, &k) == )
{
for(int i=; i<n; i++)
scanf("%d",&a[i]);
nth_element(a,a+k-,a+n,greater<int>());
printf("%d\n",a[k-]);
for(int i=; i<n; i++)
printf("%d ",a[i]);
printf("\n");
}
return ;
}
如上图所示,我要求第2大的数,首先输出了4,这是对的!
然后,nth_element将4放在了第2个位置,比起大的,均在其前;比其小的,均在其后。但并不一定有序!
这都是因为nth_element的O(n)的逆天复杂度。