洛谷 P1923 求第 k 小的数

  • 直接排序会 TLE 两个点,O(nlogn)O(n\log n)
#include<iostream>
#include<cstdio>
#include<algorithm>
#define MAXN 5000010
using namespace std;
int n,k,a[MAXN];
int main(){
#ifdef WINE
    freopen("data.in","r",stdin);
#endif
    scanf("%d%d",&n,&k);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    sort(a,a+n);
    printf("%d",a[k]);
    return 0;
}

  • 用快排的 partition,O(n)O(n)
#include<iostream>
#include<cstdio>
#include<cstdlib>
#define MAXN 5000010
using namespace std;
int n,k,x[MAXN];
void qsort(int l,int r){
    int i=l,j=r,m=x[(l+r)/2];
    do{
        while(x[j]>m)j--;
        while(x[i]<m)i++;
        if(i<=j){
            swap(x[i],x[j]);
            i++;j--;
        }
    }while(i<=j);
    if(k<=j)qsort(l,j);
    else if(k>=i)qsort(i,r);
    else{
        printf("%d",x[j+1]);
        exit(0);
    }
}
int main(){
#ifdef WINE
    freopen("data.in","r",stdin);
#endif
    scanf("%d%d",&n,&k);
    for(int i=0;i<n;i++)
        scanf("%d",&x[i]);
    qsort(0,n-1);
}

posted @ 2020-08-12 11:06  winechord  阅读(118)  评论(0编辑  收藏  举报