void swamp(int *a,int *b){
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
int randselect(int a[],int begin,int end,int x){
int k,j,i,n;
n = end - begin +1;
if(n <= 1) return a[begin];
k =begin + rand()%n;//注意是begin+,因为数组不一定是从零开始用的
swamp(&a[k],&a[begin]);
k = a[begin];
i = begin;
j = begin + 1;
while(j<=end){
if(a[j]<k){
i++;
swamp(&a[i],&a[j]);
}
j++;
}
if(a[i]> k) i--;//注意主元是和小于主元交换
if(i-begin == x) return a[begin];
else {
swamp(&a[begin],&a[i]);
if(i-begin>x) k = randselect(a,begin,i,x);//考虑i=0的情况,所以不用i-1
else k = randselect(a,i+1,end,x-i-1);
}
return k;
}
int randsortdrive(int a[],int n,int x)
{
return randsort(a,0,n-1,x-1);
}
快速选择 randomized select
最新推荐文章于 2022-04-04 09:38:01 发布