您的位置:首页 > 其它

算法导论之随机选择

2014-03-07 17:58 190 查看
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]+"  ");
		}//这说明了我们没有先排序在取值
						
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: