寻找第k小个元素:特定分治策略
问题描述
在含n个元素的无序数列中寻找第k小的元素
算法分析
递归实现图2的运算,
伪代码
核心代码
int select(int arr[],int n,int l,int r,int k)
{
int num=r-l+1;
int s=num/5;
int i=0;
int count=0;
int mid;
int j=0;
for(i=l;i<=r;i)
{
sort(arr,i,i+(i+4<=r?4:r-i));
m[j]=arr[l+(i+4<=r?(i+2):(r+i/2))];
count=j++;
i+=5;
}
sort(m,0,count);
mid=m[count/2];
int a1[100],c1=0;
int a2=mid;
int a3[100],c3=0;
for(i=0;i<n;i++)
{
if(arr[i]>mid)
{
a3[c3]=arr[i];
c3++;
}
else if(arr[i]<mid)
{
a1[c1]=arr[i];
c1++;
}
}
if(k<=c1)
{
return select(a1,c1,0,c1-1,k);
}
else if(k>c1+1)
{
return select(a3,c3,0,c3-1,k-1-c1);
}
else if(k=c1+1)
{
return a2;
}
}
GITHUB源码
https://github.com/1651928813/Pepsi_juice/tree/master/%E4%BD%9C%E4%B8%9A%E5%85%AD