快速选择 randomized select

来源:互联网 发布:windows私有云 编辑:程序博客网 时间:2024/04/26 20:10
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);}

0 0