package suanfasheji;
import java.util.Scanner;
import java.util.Random;
public class RandomizedSelect {
static Random ran=new Random();
public static void main(String[] args) {
RandomizedSelect t=new RandomizedSelect ();
int a[]=new int[10];
t.Geta(a);
t.printa(a);
Scanner s=new Scanner(System.in);
System.out.println("请选择第几小的数");
int x=s.nextInt();
System.out.println("第"+x+"小的数为:"+randomizedSelect(a,0,9,x));
}
public void Geta(int a[]) {//随机生成数组
for(int i=0;i<10;i++) {
a[i]=ran.nextInt(100);
}
}
public void printa(int a[]) {
System.out.println("输出的数组为:");
for(int i=0;i<10;i++) {
System.out.println(a[i]+" ");
}
}
public static int randomizedSelect(int a[],int p,int r,int k) {
if(p==r)return a[p];
int i=Randomizedpartition(a,p,r);
int j=i-p+1;
if(k<=j)return randomizedSelect(a, p,i,k);
else return randomizedSelect(a, i+1,r,k-j);
}
private static int Randomizedpartition(int a[],int p,int r) {
int i=ran.nextInt(r);
swap(a,i,p);
return partition(a,p,r);
}
public static int partition(int [] a,int p, int r) {//快速排序
int i=p;
int j=r+1;
int x=a[p];
while(true) {
while(a[++i]<x&&i<r);
while(a[--j]>x);
if(i>=j) break;
swap(a,i,j);
}
a[p]=a[j];
a[j]=x;
return j;
}
public static void swap(int[] a,int i,int j) {
int temp= a[i];
a[i]=a[j];
a[j]=temp;
}
}