1.问题
选第k小元素:特定分治策略
2.解析
3.设计
int find(int L[],int k,int size)
{
int pos=L[(size+1)/2];
int L1[size/2+5],L2[size/2+5];
int size1=0,size2=0;
for(int i=1;i<=size;i++)
{
if(i!=(size+1)/2){
if(L[i]<=pos)L1[++size1]=L[i];
else L2[++size2]=L[i];
}
}
if(k==size1+1){
return pos;
}else if(k<size1+1){
return find(L1,k,size1);
}else{
return find(L2,k-(size1+1),size2);
}
}
4.分析
时间复杂度为O(n)
5.源码
https://github.com/lmouette/-/blob/main/select.cpp