1.问题
选第 k 小元素:特定分治策略。
2.解析
3.设计
int select(int a[],int n , int k){
int cnt=n/5;
if(n<=6){
sort(a,a+n,cmpx);
return a[k-1];
}
else{
int b[m],c[m],d[m];
int j=0,t=0;
for(int i= 0 ; i<n ;++i){
b[j++]=a[i];
if((i+1) % 5==0||i==n-1){
sort(b,b+j,cmpx);
c[t++]=b[j/2];
j=0;
}
}
sort(c,c+t,cmpx);
if(k==localData(a,c[t/2]))
return c[t/2];
else if (k<localData(a,c[t/2])){
int i=0;j=0;
while(i<n)
{
if(a[i]<c[t/2])
d[j++]=a[i];
i++;
}
n=j;
copyData(a,d,j);
return select(a,n,k);
}
else {
int i=0,j=0;
while(i<n)
{
if(a[i]>c[t/2])
d[j++]=a[i];
i++;
}
k=k-n+j;
n=j;
copyData(a,d,j);
return select(a,n,k);
}
}
}
4.分析
O(n)
5.源码
https://github.com/vup-kano/suanfa/blob/main/divideandconque.cpp