3:我这里以查找第k小的数为例子,使用快速排序的变种,平均时间复杂度O(n)
如果查找第K个大的数方法类似:
int find(int a[], int n, int k){
int v=a[0];
int b[n-1];
int i,s=0,t=n-2;
for(i=1;i<n;i++){
if(a[i]<v){
b[s++]=a[i];
}else{
b[t--]=a[i];
}
}
if(s==k-1)return v;
if(s<k-1){
return find(b+s,n-s-1,k-s-1);
}else{
return find(b,s,k);
}
}
第二步就很简单了,
int x=find(a,n,k);
for(s=0,i=0;i<n;i++){
if(a[i]<=x&&s<i){
int v=a[i];
a[i]=a[s];
a[s++]=v;
}
}