求無序數組的第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);

}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章