- 直接排序会 TLE 两个点,O(nlogn)
#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)
#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);
}