从 a【left,right】中,返回第k大的数
1、随机划分:
int randPartition(int a[],int left,int right)
{
int p=(int)round(1.0*rand()/RAND_MAX*(right-left)+right);
swap(a[left],a[p]);
int temp=a[left];
while(left<right)
{
while(a[right]>temp&&left<right) right--;
a[left]=a[right];
while(a[left]<temp&&left<right) left++;
a[right]=a[left];
}
a[left]=temp;
return left;
}
2、从a[left,right]中,返回第k大的数
int randSelect(int a[],int left,int right,int k)
{
if(left==right) return a[left];
int p=randPartition(a,left,right);
int m=p-left+1;
if(m==k) return a[p];
else if(m>k) randSelect(a,left,p-1,k); ///p-1!
else randSelect(a,p+1,right,k-m);
}

本文深入探讨了随机选择算法,一种高效查找数组中第k大元素的方法。通过详细解析randPartition和randSelect函数,展示了如何利用随机划分策略进行快速选择,避免了完全排序的高成本,特别适用于大数据集。
1747

被折叠的 条评论
为什么被折叠?



