nth_element      复杂度O(n)

nth_element是<algorithm>里面的一个库函数

可以用来方便的求出第n大的数  

用法

nth_element(a+L, a+n,a+R )          范围是  [ L , R )

nth_element并不会为整个数列排序  

而是调用nth_element(a+L, a+n,a+R ) 方法之后呢

第n个位置(L是第0个位置 从L开始数的第n个)的数  前边都是比他小的  后边都是比他大的

(将比这个元素小的元素都排在这个元素之前,比这个元素大的元素都排在这个元素之后)

举个栗子

这段代码的执行结果呢是

从0开始数  0,1,2,3,4,5   a [ 5 ]的位置上的数  前边的都比他小  后边的都比他大

这个函数就是这么一个效果

那么我们怎么用这个函数找数列中第k大的数呢?

既然是第k大  那么比他还大的数就有k-1个  应该排在他后边

那么他就是就从后往前数的第k个数   也就是正着数的第n-k个数

那么我们就用   nth_element(a+0 , a+n-k , a+n ) 

用数组的写法


//使用nth_element求数组中第k大的数
#include<bits/stdc++.h>
using namespace std;
int main(){
    int a[10]={9,8,7,6,5,4,3,2,1,0};
    int k;
    while(~scanf("%d",&k)){
        nth_element(a+0,a+10-k,a+10);
        printf("数列中第%d大的数是  %d\n",k,a[10-k]);
    }
}

执行结果

使用容器的写法

//使用nth_element求数组中第k大的数
#include<bits/stdc++.h>
using namespace std;
int main(){
    vector<int>a;
    for(int i=0;i<10;i++){
        a.push_back(i);
    }
    int k;
    scanf("%d",&k);
    nth_element(a.begin(),a.begin()+a.size()-k,a.end());
    printf("数列中第%d大的数是  %d\n",k,a[a.size()-k]);
}

执行结果