排序基礎css
排序方法分兩大類,一類是比較排序,快速排序(Quick Sort)、歸併排序(Merge Sort)、插入排序(Insertion Sort)、選擇排序(Selection Sort)、希爾排序(Shell Sort)、堆排序(Heap Sort)等屬於比較排序方法,比較排序方法理論最優時間複雜度是O(nlogn),各方法排序過程和原理見 可視化過程。html
另外一類是非比較排序,被排序元素框定範圍的前提下可以使用非比較排序方法,例如桶排序(Bucket Sort)、計數排序(Counting Sort)等,時間複雜度可減小至O(n)。git
比較排序方法github
快速排序(Quick Sort) 快速選擇(Quick Select)是快速排序的衍生引用,經常使用於求中位數、Kth數字。數組
相關LeetCode題:函數
973. K Closest Points to Origin 題解 ui
插入排序(Insertion Sort) spa
相關LeetCode題: 3d
147. Insertion Sort List 題解code
歸併排序(Merge Sort) 有一項引伸應用、計算數組的Inversions,即求數組中知足於a[i] > a[j] 且 i < j 這樣條件的對數,詳見 Count Inversions in an array | Set 1 (Using Merge Sort)
C++中提供了兩個內置的歸併排序方法:
merge(l1.begin(), l1.end(), l2.begin(), l2.end(), result.begin());//which stores the merged array in result
inplace_merge(l.begin(), l.middle, l.end());//where array [begin, middle) is merged with array [middle, end).
相關LeetCode題:
315. Count of Smaller Numbers After Self 題解
非比較排序方法
桶排序(Bucket Sort) 可視化過程,桶排序也有一些引伸應用,例如 LeetCode題目 164. Maximum Gap 利用桶劃分取值求兩元素間隔最大值。
相關LeetCode題:
計數排序(Counting Sort) 可視化過程
相關LeetCode題:
1030. Matrix Cells in Distance Order 題解
排序的應用
實際應用中咱們不從頭實現排序函數、常直接調用庫函數完成排序,如C++ STL中經常使用的sort、partial_sort等。
相關LeetCode題:
349. Intersection of Two Arrays 題解
350. Intersection of Two Arrays II 題解
976. Largest Perimeter Triangle 題解
非典型排序問題
一些問題要求按必定規則對序列進行排序,好比「奇偶奇偶……」奇數、偶數交疊,或 nums[0] <= nums[1] >= nums[2] <= nums[3]……,我稱之爲非典型排序問題。
這類問題不能用上述排序方法解決,更可能是考量對數組元素排布的處理邏輯。
相關LeetCode題: