题解:
利用快排的思路,快排每一趟都会将一个位置的数确定,所以在递归的时候剪枝一下就可以优化时间复杂度。
#include<iostream>
using namespace std;
const int N=2e6+5;
int a[N],n,k;
void quick_sort(int l,int r){
if(l>=r) return ;
int i=l-1,j=r+1,x=a[l+r>>1];
while(i<j){
do i++;while(a[i]>x);
do j--;while(a[j]<x);
if(i<j)swap(a[i],a[j]);
}
if(k>j) quick_sort(j+1,r);//仅当右区间的左端点小于k时进行快排
else quick_sort(l,j);
}
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
quick_sort(1,n);
printf("%d",a[k]);
return 0;
}