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