求无序数组的第K大的数

1、利用快排的思想,只在满足要求的片段上进行排序,求解,这样时间复杂度由O(nlogn)变为O(n)。

      按从大到小的进行排序,将大的都放在左边,经过第一次迭代划分结束后,枢轴的位置左侧均比枢轴原始大,如果枢轴的位置first刚好等于k-1(数组下标从0开始计),则枢轴元素即为第k大,如果first比k-1大,说明第k大的元素在左侧,这样只排左侧就可以,右侧抛弃;如果枢轴位置first比k-1小,说明第k大的在右侧,排序右侧即可,直到找到第k个最大。

public class FindKthMax {

public static void findKthMax(int[] nums, int low, int high, int k) {

int first = low;

int last = high;

int key = nums[first];

while(first < last)

{

while(first<last && nums[last] <= key)

--last;

nums[first] = nums[last];

while(first < last && nums[first] >= key)

++first;

nums[last] = nums[first];

}

nums[first] = key;

if(first == k - 1)

{

System.out.println("Kth max:" + key);

return;

}

else if(first > k - 1)

findKthMax(nums, low, first-1, k);

else

findKthMax(nums, first + 1, high, k);

}

public static void main(String[] args) {

int[] nums = {-14, 4, 6, 5, 2, 9, 8};

findKthMax(nums, 0, 6, 4);

}

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值