import java.util.Random;
public class RandomizedSelect {
public static void main(String args[]){
int[] data={
54,49,48,47,46,45,44,43,42,41,
40,39,38,37,36,35,34,33,32,31,
30,29,28,27,26,25,24,23,22,21,
20,19,18,17,16,15,14,13,12,11,
10,9,8,7,6,5,4,3,2,1
};
System.out.println(randomizedSelect(data,0,data.length-1,50));
}
private static int randomizedSelect(int[] A, int p, int r, int i) {
int q,k;
if(p==r)
return A[p];
q=randomizedPartition(A,p,r);
k=q-p+1;
if (i==k)
return A[q];
else if (i<k)
return randomizedSelect(A,p,q-1,i);
else
return randomizedSelect(A,q+1,r,i-k);
}
private static int randomizedPartition(int[] A, int p, int r) {
Random random=new Random();
int i=random.nextInt(r-p)+p;
int temp;
temp=A[r];
A[r]=A[i];
A[i]=temp;
return partition(A,p,r);
}
private static int partition(int[] A, int p, int r) {
int temp;
int i,x;
x=A[r];
i=p-1;
for(int j=p;j<r;j++){
if(A[j]<=x){
i++;
temp=A[i];
A[i]=A[j];
A[j]=temp;
}
}
i++;
temp=A[i];
A[i]=A[r];
A[r]=temp;
return i;
}
}