求数组中的第K个最小值

    public static void firstKMaxValue(int[] array, int start, int end, int k) {
		if (start > end || k >= array.length) { // 限制条件
			return;
		}
		// 索引为start的值作为分区值
		int div = array[start];
		int j = start; // 作为分区值得索引
		// 以下循环将数组分为两部分,左边部分小于分区值,右边部分大于等于分区值
		for (int i = start + 1; i <= end; i++) {
			if (array[i] < div) {
				j++;
				if (j != i) {
					int tmp = array[i];
					array[i] = array[j];
					array[j] = tmp;
				}
			}
		}
		array[start] = array[j];
		array[j] = div;
		
		// 此时分区值处于它在数组中对应的位置上,如分区值是数组中的第2个元素,那么j就应该等于1。
		// 如果j<k,就以array[j+1]作为分区值,重新划分右部分数组
		// 如果j>k,就以array[start]作为分区值,重新划分左部分数组。
		// (注意这里的array[start]与原始数组的array[start]的值可能是不同的。)
		// 如果j=k,就计算出了数组中第K(k>=0)个最大数的值。
		if (j < k) {
			firstKMaxValue(array, j+1, end, k);
		} else if (j > k) {
			firstKMaxValue(array, start, j-1, k);
		} else {
			System.out.println("第"+k+"个最小值:"+array[j]);
		}
		
	}


转载于:https://my.oschina.net/wxcchd/blog/268328

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值