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