O(n)求数组中第k大的元素——快排划分

利用了快排的划分,以及前面说的那种计数的方法。

1+1/2+1/4+...=2*n

#include<cstdio>
//1+1/2+1/4+1/8+1/16+...=2*n
const int MAXN=1007;
void swap(int *x,int *y){
    int tmp=*x;
    *x=*y;
    *y=tmp;
}
int a[MAXN];
int the_kth(int l,int r,int K){//L到R区间中第K大的数
    if(K>=r-l+1)return -1;
    int i=l,j=r;
    while(i!=j){
        while(a[j]>=a[l]&&i<j)j--;
        while(a[i]<=a[l]&&i<j)i++;
        swap(&a[i],&a[j]);
    }
    swap(&a[i],&a[l]);
    if(K==i-l+1)return a[i];
    else if(K>i-l+1)return the_kth(i+1,r,K-(i-l+1));
    else return the_kth(l,i-1,K);
}
int main(){
    int N,K;scanf("%d%d",&N,&K);
    for(int i=1;i<=N;++i)scanf("%d",&a[i]);
    printf("%d",the_kth(1,N,K));
    return 0;
}
代码

 

posted on 2018-01-28 16:11  Na_OH  阅读(212)  评论(0编辑  收藏  举报

导航