package contcurrentandalgorithm;
import java.util.Random;
/**
*
* @author Administrator
* zyyjiao@mail.ustc.edu.cn
*/
public class SelectKMinAndMax {
public static void main(String[] args) {
int a[] = {2, 3, 4, 1, 5, 10, 9, 7, 8, 6};
int k = 4;
int result = selectKMin(a, 0, 9, k);
//SelectKMinAndMax sl = new SelectKMinAndMax();
//System.out.println(SelectKMinAndMax.selectKMin(a, 0, 9, k));
System.out.println(result);
}
public static void swap(int a[], int i, int j) {
int temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
public static int partion(int a[], int p, int r) {//根据pivot a[r]来划分数组
int pivot = a[r];
int low = p - 1;
int i;
for (i = p; i < r; i++) {
if (a[i] < pivot) {
swap(a, ++low, i);
}
}
swap(a, ++low, r);
return low;
}
public static int RondomPartition(int a[], int p, int r) {
int i;//随机选择一个pivot来划分
Random rd = new Random();
// i = p+(rd)%(r-p+1);
i = rd.nextInt(10);
swap(a, i, r);
return partion(a, p, r);//返回轴位置
}
public static int selectKMin(int a[], int p, int r, int k) {
if (p == r) {
return a[p];
}
int q = RondomPartition(a, p, r);
int count = q - p + 1;//计算 a[p..q]的元素数量
if (k == count)//刚好,返回
{
return a[q];
} else if (k < count)//在前半部分
{
return selectKMin(a, p, q - 1, k);
} else //在后半部分
{
return selectKMin(a, q + 1, r, k - count);
}
}
}