import java.util.Random;
/*
* 找数组中第i小的数
*/
public class RandomSelect {
public static void main(String[] args) {
new RandomSelect().start();
}
private void start() {
int[] array = {15,24,13,98,47,65,39,71};
System.out.println("第5大的数为:"+randomSelect(array,0,array.length-1,5));
}
private int randomSelect(int[] array, int p, int r, int i) {
if(p == r) {
return array[p];
}
int q = randomPartition(array,p,r);
int k = q-p+1;
if(i==k) {
return array[q];
} else if(i<k) {
return randomSelect(array,p,q-1,i);
} else {
return randomSelect(array,q+1,r,i-k);
}
}
private int randomPartition(int[] a, int p, int r) {
//产生p-r的随机数
int i =(Math.abs(new Random().nextInt()))%(r-p+1)+p;
exchange(a,i,r);
return partition(a,p,r);
}
private int partition(int[] a, int p, int r) {
int key = a[r];
int j = p-1;
for(int i=p;i<r;i++) {
if(a[i]<key) {
j++;
exchange(a,i,j);
}
}
exchange(a,j+1,r);
return j+1;
}
private void exchange(int[] a, int i, int r) {
int temp = a[i];
a[i] = a[r];
a[r] = temp;
}
}
运行结果为:
第5大的数为:47