215 陣列中的第K個最大元素

2022-01-16 13:40:44 字數 608 閱讀 5109

class solution 

public int quickselect(int a,int l,int r,int k)

if(k <= j) return quickselect(a,l,j,k);

else return quickselect(a,j + 1,r,k);

}public void swap(int a,int l,int r)

}

快速選擇演算法

時間複雜度 \(o(n)\)

參考快排的思路,但是每次只選擇一邊進行遞迴,不會把兩邊都遞迴

題目要求,第 k 大,也就是把陣列排序後(下標從 0 開始),第 n - k 小的數

每次直接把陣列以 base 為中心(這個 base 可以用 random 來取,可以防止被卡)切分成兩半

然後把整個陣列重新整理,撥開到兩邊,那麼這樣的話 base 所在的位置,就一定是排好序後,它下標的位置

最後 i j 退出迴圈的時候,一定在 base 的分界線處

所以,如果要求的下標 k 在左邊,就繼續遞迴左邊\([l,j]\),否則就遞迴右邊\([j + 1,r]\)

不斷夾逼,就會找到在下標為 k 的數

215 陣列中的第K個最大元素

題目 方法一 二 時間複雜度 o n logk 向大小為k的堆中新增元素的時間複雜度為o logk 我們將重複該操作n次 空間複雜度 o k 用於儲存k個堆元素 自己解答 速度太慢?有待提高 time 2019 10 9 下午01 04 file 陣列中第k大元素 215.py 在未排序的陣列中找到...

215 陣列中的第K個最大元素

思路1 快排 考慮先使用快排實現,練習快排。時間複雜度o n 如果我們把每次分割槽遍歷的元素個數加起來,就是 n n 2 n 4 n 8 1。這是乙個等比數列求和,最後的和等於 2n 1。所以,時間複雜度就為 o n 因為一次快排可以實現乙個數歸位,比較index和n k的大小 如果index n ...

215 陣列中的第K個最大元素

在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。輸入 3,2,1,5,6,4 和 k 2 輸出 5 輸入 3,2,3,1,2,4,5,5,6 和 k 4 輸出 4 你可以假設 k 總是有效的,且 1 k 陣列的長度。思路和演...