package select;
import java.util.Random;
public class Randomized_Select {
int Partition(int a[],int p,int r){//就是快速排序里面的
int x=a[r];//把每次数组A的最后一个元素作为主元
int i=p-1;//开始的时候将i 移动到数组的外面
for(int j=p;j<=r-1;j++){
if(a[j]<=x){//把
i++;
swap(a, i,j);//p--i是小于等于x的,i+1--j-1是大于等于x的,j--r是还未处理的要交换下
}
}
swap(a, i+1, r);//把主元放在中间好区分两边的
return i+1;//返回主元的位置
}
void swap( int [] A, int firstIndex, int secondIndex){
int temp = A[firstIndex];
A[firstIndex] = A[secondIndex];
A[secondIndex] = temp;
}
public int Randomized_Partition(int[] a,int p,int r){
Random ran=new Random();
int j=ran.nextInt(r-p)+p;//nextINT(n)返回的是0到n之间的整数
swap(a, j, r);
return Partition(a,p,r);
}
public int RandomizedSelect(int[] a,int p,int r,int i){
if(p==r)
return a[p];
int q=Randomized_Partition(a,p,r);//分成两部分A[p---q-1]和A【q----r】
int k=q-p+1;//A[p--q-1]和主元A【q】的元素个数
if(i==k)
return a[q];
if(i<k)
return RandomizedSelect(a,p,q-1,i);//i<k左边找
else
return RandomizedSelect(a,q+1,r,i-k);//i>k右边找
}
public static void main(String[] args) {
Randomized_Select rs=new Randomized_Select();
int a[]={2,8,7,1,3,5,6,12,5,67,4};
System.out.println("第"+3+"小的数是"+rs.RandomizedSelect(a,0,a.length-1,3));
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}//这说明了我们没有先排序在取值
}
}
算法导论之随机选择
最新推荐文章于 2020-10-14 05:43:50 发布