第k小数
利用快速排序的思想,从序列中取一个数mid,然后把序列分成小于等于mid和大于等于mid的两部分,由两个部分的元素个数和k的大小关系可以确定这个数是在哪个部分。对部分序列的探查可以递归处理。
时间复杂度近似为O(n)
代码示例
//O(n)求sort(升序)后第k位数字
#include<bits/stdc++.h>
using namespace std;
int arr[1000010];
void quickSelect(int a[],int l,int r,int rank)
{
int i=l,j=r,mid=a[(l+r)>>1];
do{
while(a[i]<mid) ++i;
while(a[j]>mid) --j;
if(i<=j){
swap(a[i],a[j]);
++i;
--j;
}
}while(i<=j);
if(l<=j && rank<=j-l+1) quickSelect(a,l,j,rank);
if(i<=r && rank>=i-l+1) quickSelect(a,i,r,rank-(i-l));
}
int quick_select(int a[],int n,int k)//第k小
{
quickSelect(a,1,n,k);
return a[k];
}
int main()
{
srand(time(0));
int n,m;
cin>>n>>m;
for(int i=1;i<=n;++i) arr[i]=rand()%1000;
for(int i=1;i<=n;++i) cout<<arr[i]<<' ';
cout<<endl;
cout<<"第"<<m<<"位数字是"<<quick_select(arr,n,m)<<endl;
sort(arr+1,arr+1+n);
for(int i=1;i<=n;++i) cout<<arr[i]<<' ';
return 0;
}