K分位数问题

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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值