快速尋找第k大元素

2021-08-25 19:22:30 字數 810 閱讀 8464

我們先思考排序為什麼可以解決該問題:

如果我們隨便選定乙個元素,假想的認為它就是我們要找的第k大元素,我們最終要考察,證明的是這個元素在序列降序排序後到底應該處於哪個位置,如果是在第k位,那自然就是第k大元素。說到這裡似乎漏出了點端倪,是啊,我們這樣證明的話並不需要將序列完整的排序,我們只需要將比這個選定元素小的元素排在他的前面,比他大的開到後面去,這時他是不是第k大的元素同樣一目了然。

這樣子搞,運氣好了,選的元素正好就是第k大的,那賊舒服,美滋滋。

但人生不如意事十之**,如果有這個運氣,似乎買彩票都能中獎了。

別慌,雖然我們可能一下子猜不對,但是我們每次猜測都是對歷史程序有幫助的!

假如我們有亂序序列 5 8 3 2 1,我們想求它的第3大元素,我們最開始隨便一猜,認定5就是第k大元素,這個時候我們把比5大的放到5的左邊,比比5小的放到5的右邊

序列變成了 8 5 3 2 1. 

額,第一次沒猜中,不過真的不遺憾,我們猜的5,最終位置是2,比3要小,我們至少可以判斷第3大元素肯定不在2及的左邊

我們考察的範圍可以縮小至近乎原來的一半。我們只需要考察3 2 1即可,接下來,我們猜的是3,比他大的放到左邊,比他小的放到右邊,序列沒變!仍然是 8 5 3 2 1 。這時,我們確定了3就是我們猜的第3大元素,進行輸出

for(int lo=0 , hi = n-1; lo= pivot)i++;a[j] = a[i];//左邊大於pivot的都跳過,小於的提到後面去

}a[i] = pivot;//撞車的部分不是i發現不對勁就是j發現了不對勁,元素已經被轉移了

if( i == k)

尋找陣列中的第K大元素

一 簡述 使用資料結構堆,實現查詢陣列中的第k大元素。流程如下 陣列內容堆化 因為是查詢第k大,所以使用大根堆 依次取出並刪除堆的根節點 將剩餘元素堆化 取到第k個即為目標元素。二 實現 include include using namespace std intfindkth vector in...

第k大元素

在陣列中找到第k大的元素 最先想到的是簡單排序,但是簡單排序超時,於是想到改造快排,快排的思想是每次確定乙個元素在陣列中的下標,如果確定的下標為k那該元素為k大,若下標大於k,第k大在改下標之前.class solution public int pat int nums,int start,int...

第K大元素

在陣列中找到第k大的元素。給出陣列 9,3,2,4,8 第三大的元素是4 給出陣列 1,2,3,4,5 第一大的元素是5,第二大的元素是4,第三大的元素是3,以此類推 要求時間複雜度為o n 空間複雜度為o 1 如果不考慮時間複雜度和空間複雜度,這道題目有很多種方法,利用一種排序演算法將陣列倒敘排序...