基於leetcode215題的對於排序演算法的思考

2021-09-23 15:50:09 字數 1386 閱讀 6122

在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。

樣例

示例 1:

輸入: [3,2,1,5,6,4] 和 k = 2

輸出: 5

示例 2:

輸入: [3,2,3,1,2,4,5,5,6] 和 k = 4

輸出: 4

說明:你可以假設 k 總是有效的,且 1 ≤ k ≤ 陣列的長度。

(庫函式排序) o(n

long

(n

)o(nlong(n)

o(nlon

g(n)

對於這一道題,最直觀的做法便是使用內建的排序函式排序,而第k大就是從小到大排第n-k+1個元素,他的下標則是n-k

c++ **

class solution 

};

堆排序(nlong(n))

對於第k個元素,也可以使用堆排序來做,c++內建了優先佇列,是乙個小根堆,他的堆頂是最大的元素,有兩種寫法

class solution 

return q.

top();

}};

寫法2

class solution 

return q.

top();

}};

快速選擇o(n)

演算法一內建的sort底層實現也是一種快速排序演算法,類似於快速排序的思想,在每次完成一次劃分之後,可以判斷要尋找的第k大的數也就是陣列座標k-1的與每次的劃分點j分界線的大小,由於每趟快排分界點的數都放在了最終排序後的位置,當[k-1]小於等於j時,此時要尋找的第k大的數字位於j前面的區域,根據二分的思想,可以得知k必定不在j之後的區域,因此只對前面部分排序,反之則直對後面部分排序,弱l=r說明只有乙個元素,便是我們要找的k大的值

時間複雜度分析:o(n)

第一次掃瞄一遍n次,第二趟平均n/2次,第k次平均n/(2^k)次,這一級數和收斂,因此時間複雜度還是o(n)

class solution 

intpartition

(vector<

int>

& nums,

int l,

int r,

int k)

if(j>=k-1)

return

partition

(nums,l,j,k)

;//因為第k大對應下標為k-1

else

return

partition

(nums,j+

1,r,k)

;// return 0;}}

;

leetcode 215 快速排序

用快速排序來寫的 這裡一定要明確每個變數的定義,不然很容易出錯 class solution 在 l,r 之間尋找第k大個元素 private int findkthlargest vector nums,int l,int r,int k 返回p使得 0,p 都小於 等於nums 0 p,r 都大...

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

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

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

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