代码备查

第六课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]+"_");
 }
}


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值