演算法與資料結構基礎 - 排序(Sort)
排序基礎
排序方法分兩大類,一類是比較排序,快速排序(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題:
147. Insertion Sort List 題解
歸併排序(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題:
148. Sort List 題解315. Count of Smaller Numbers After Self 題解
327. Count of Range Sum 題解
493. Reverse Pairs 題解
非比較排序方法
桶排序(Bucket Sort) 視覺化過程,桶排序也有一些引申應用,例如 LeetCode題目 164. Maximum Gap 利用桶劃分取值求兩元素間隔最大值。
相關LeetCode題:
1057. Campus Bikes 題解164. Maximum Gap 題解
計數排序(Counting Sort) 視覺化過程
相關LeetCode題:
1122. Relative Sort Array 題解
1030. Matrix Cells in Distance Order 題解
排序的應用
實際應用中我們不從頭實現排序函式、常直接呼叫庫函式完成排序,如C++ STL中常用的sort、partial_sort等。
相關LeetCode題:
349. Intersection of Two Arrays 題解
350. Intersection of Two Arrays II 題解
1086. High Five 題解
976. Largest Perimeter Triangle 題解
56. Merge Intervals 題解
253. Meeting Rooms II 題解
57. Insert Interval 題解
527. Word Abbreviation 題解
179. Largest Number 題解
274. H-Index 題解
非典型排序問題
一些問題要求按一定規則對序列進行排序,比如“奇偶奇偶……”奇數、偶數交疊,或 nums[0] <= nums[1] >= nums[2] <= nums[3]……,我稱之為非典型排序問題。
這類問題不能用上述排序方法解決,更多是考量對陣列元素排布的處理邏輯。
相關LeetCode題:
75. Sort Colors 題解
922. Sort Array By Parity II 題解
280. Wiggle Sort 題解324. Wiggle Sort II 題解
1054. Distant Barcodes 題解
767. Reorganize String 題解
969. Pancake Sorting 題解
&n