从 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);
}