排序基礎
排序方法分兩大類,一類是比較排序,快速排序(Quick Sort)、歸併排序(Merge Sort)、插入排序(Insertion Sort)、選擇排序(Selection Sort)、希爾排序(Shell Sort)、堆排序(Heap Sort)等屬於比較排序方法,比較排序方法理論最優時間複雜度是O(nlogn),各方法排序過程和原理見 視覺化過程。
另一類是非比較排序,被排序元素框定範圍的前提下可使用非比較排序方法,例如桶排序(Bucket Sort)、計數排序(Counting Sort)等,時間複雜度可減少至O(n)。
比較排序方法
快速排序(Quick Sort) 快速選擇(Quick Select)是快速排序的衍生引用,常用於求中位數、Kth數字。
相關LeetCode題:
973. K Closest Points to Origin 題解
插入排序(Insertion Sort)
相關LeetCode題:
歸併排序(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題:
922. Sort Array By Parity II 題解