演算法與資料結構基礎 - 排序(Sort)

bangerlee發表於2019-08-12

排序基礎

排序方法分兩大類,一類是比較排序,快速排序(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題:

315. Count of Smaller Numbers After Self  題解

327. Count of Range Sum  題解

493. Reverse Pairs  題解

 

非比較排序方法

桶排序(Bucket Sort)  視覺化過程,桶排序也有一些引申應用,例如 LeetCode題目 164. Maximum Gap 利用桶劃分取值求兩元素間隔最大值。

相關LeetCode題:

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  題解

324. Wiggle Sort II  題解

1054. Distant Barcodes  題解

767. Reorganize String  題解

969. Pancake Sorting  題解

 

相關文章