K分位数问题实现,对一个含有n个元素的集合来说,所谓的k分位数,就是能把已排序的集合分成k个大小相等的集合的“k-1个顺序统计量”。请给出一个能求出含有n个元素(无序)的集合的k分位数的O(nlgk)时间的算法。
以下为程序代码:
以下为程序代码:
public static void findKthQuantile(int[] src, int p, int r, int k){
if (k==1)return;
int med = ArrayOrder.randomSelect(src, p, r, ((r-p+1)/k)*(k/2));
System.out.println(med);
partition(src, med);
findKthQuantile(src, p, p+((r-p+1)/k)*(k/2)-1, k/2);
findKthQuantile(src, p+((r-p+1)/k)*(k/2), r, k-k/2);
}
public static void partition(int[] src, int m){
int j = 0;
int temp;
for (int i = 0; i < src.length; i++) {
if (src[i]<=m) {
temp = src[i];
src[i] = src[j];
src[j++] = temp;
}
}
}
public static int randomSelect(int[] src, int p, int r, int i) {
if (p == r) return src[p];
int q = partitionRandom(src, p, r);
//int q = partition(src, p, r);
if ((q-p+1)==i) {
return src[q];
}
else if ((q-p+1)>i) {
return randomSelect(src, p, q-1, i);
}else {
return randomSelect(src, q+1, r, i-q+p-1);
}
}
public static int partitionRandom(int[]src, int p, int r){
int i = new Random().nextInt(r-p) + p;
int temp = src[r];
src[r] = src[i];
src[i] = temp;
return partition(src, p, r);
}