算法思想
基于快排,每次递归通过比较当前长度与k的大小从而判断进入哪一个递归
- 若
k<=sl
,则第k
小的数一定在左边,进入quick_searck(a,l,j,k)
寻找左边第k
小的数 - 若
k>sl
,则第k
小的数一定在右边,进入quick_searck(a,j+1,r,k-sl)
寻找第sl-k
小的数
代码如下
const int N=1e5+10;
int a[N];
int n,k;
int quick_search(int a[],int l,int r,int k){
if(l==r)return a[l];
int x=a[l+r>>1],i=l-1,j=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]);
}
int sl=j-l+1;
if(k<=sl) return quick_search(a,l,j,k);
else return quick_search(a,j+1,r,k-sl);
}