package com.sort;
import java.util.Random;
public class RandomSelect {
public static int randomSelect(int [] data,int p,int r,int i){
if(p==r){
return data[p];
}
int q=partition(data,p,r);
int k=q-p+1;
if(i==k){
return data[q];
}else if(i<k){
return randomSelect(data,p,q-1,i);
}else{
return randomSelect(data,q+1,r,i-k);
}
}
private static int partition(int []data ,int p,int r){
int random=new Random().nextInt(r-p)+p;
int tmpR=data[random];
data[random]=data[r];
data[r]=tmpR;
int x=data[r];
int i=p-1;
for(int j=p;j<=r-1;j++){
if(data[j]<=x){
i=i+1;
int tmp=data[i];
data[i]=data[j];
data[j]=tmp;
}
}
int tmp=data[i+1];
data[i+1]=data[r];
data[r]=tmp;
return i+1;
}
public static void main(String[] args) {
int [] data=new int[]{1,8,3,7,5,4,2,9};
for(int i=0;i<data.length;i++){
System.out.print(data[i]+" ");
}
System.out.println();
int select=randomSelect(data,0,data.length-1,4);
System.out.println(select);
}
}
算法实践篇-基于快速排序原理的选择第i小元选择算法
最新推荐文章于 2020-04-20 18:02:10 发布