第六课http://open.163.com/movie/2010/12/J/J/M6UTT5U0I_M756SE0JJ.html随机化快排
import java.util.Random;
import java.util.stream.IntStream;
public class randomSelect {
public static int randomselect(int[] A,int p,int q,int i)
{
int r,k;
if(p==q) return A[p];
r=RandPartition(A,p,q);
System.out.println("p:"+p+"q:"+q+"i:"+i+"\n");
System.out.println("r:"+r+"\n");
k=r-p+1;
System.out.println("k:"+k+"\n");
if(i==k) return A[r];
else if(i<k) return randomselect(A,p,r-1,i);
else return randomselect(A,r+1,q,i-k);
}//用于找出第i小的数
private static void RandQuickSort(int[] A, int p, int r) {
// TODO 自动生成的方法存根
if (p<r) {
int q=RandPartition(A,p,r);
RandQuickSort(A,p,q-1);
RandQuickSort(A,q+1,r);
}
}//随机化快排
private static int RandPartition(int[] A, int p, int r) {
// TODO 自动生成的方法存根
int i=RANDOM(p,r);
System.out.println("i:"+i+"\n");
System.out.println("交换"+i+"_"+A[i]+"和"+r+"_"+A[r]+"\n");
A=exchange(A,r,i);
return partition(A,p,r);
}
private static int partition(int[] A, int p, int r) {
// TODO 自动生成的方法存根
int x=A[r];
int i=p-1;
for (int j=p;j<r;j++){
if(A[j]<=x) {
i++;
System.out.println("交换"+i+"_"+A[i]+"和"+j+"_"+A[j]+"\n");
A=exchange(A,i,j);
}
}
System.out.println("交换"+(i+1)+"_"+A[i+1]+"和"+r+"_"+A[r]+"\n");
exchange(A,i+1,r);
return i+1;
}
private static int[] exchange(int[] A, int r, int i) {
// TODO 自动生成的方法存根
if(r==i) return A;
else{
int temp=A[r];
A[r]=A[i];
A[i]=temp;
return A;
}
}
private static int RANDOM(int origin, int bound) {
// TODO 自动生成的方法存根
Random ra=new Random();
int n=bound-origin;
if (n > 0) {
return ra.nextInt(n) + origin;
}
else { // range not representable as int
int r1;
do {
r1 = ra.nextInt();
} while (r1 < origin || r1 >= bound);
return r1;
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
int A[]={5,4,8,3,9,7,2,6,1,0};
int result=randomselect(A,0,9,5);
System.out.println("结果:"+result+"_"+A[result]+"\n");
//RandQuickSort(A,0,9);
for(int i=0;i<A.length;i++)
{
System.out.println(A[i]+"_");
}
}
}