[低端筆記] MIT算法導論 3. Insertion Sort, Merge Sort
MIT的算法導論公開課有兩種版本, 我選較新版的
MIT 6.006 Introduction to Algorithms, Fall 2011
官方筆記
Insertion sort, merge sort (PDF)Why Sorting?
- 資料整理
- 使問題更容易解決
- 中間值問題
- A[0:n](unsorted) → B[0:n](sorted) → B[n/2]
- 二元搜尋(Binary search)
- 搜尋k → 比較根結點B[n/2]剔除另一子樹
- 其他應用
- 資料壓縮
- Computer graphics
Insertion sort(10:00)
INSERTION-SORT (A, n) for j ← 2 to n 將A[j]插入排序過的sub-array A[1:j-1] 比較並swap
平均複雜度 O(n^2): O(n)步驟, 每步驟O(n)
#Python
def insertion_sort(lst): for i in range(1, len(lst)): temp = lst[i] j = i - 1 while j >= 0 and temp < lst[j]: lst[j + 1] = lst[j] j -= 1 lst[j + 1] = temp return lst
Binary Insertion sort
插入時用Binary search取代原本的循序比較
比較次數降為O(n log n)
swap次數不變, 因此複雜度仍為 O(n^2)
Merge Sort (24:50)
採用divide and conquer
= 2T(n/2) + Θ(n) if n > 1
→ T(n) = Θ(n log n) by master theorem (課程用遞迴樹解)
- If n = 1, done (nothing to sort)
- recursively sort A[ 1 . . n/2 ], A[ n/2+1 . . n ]
- 合併兩個排序完成的sub-arrays
#複雜度分析
各步驟複雜度- Θ(1)
- 2T(n/2)
- Θ(n)
= 2T(n/2) + Θ(n) if n > 1
→ T(n) = Θ(n log n) by master theorem (課程用遞迴樹解)
空間複雜度
Merge Sort需要Θ(n)的額外空間
而Insertion sort這類in-place排序只需要Θ(1)的額外空間
(存在in-place Merge Sort)
(存在in-place Merge Sort)
花費時間比較
Merge Sort in python: 2.2nlgn µs
Insertion sort in python: 0.2n^2 µs
Insertion sort in C: 0.01n^2 µs
沒有留言:
張貼留言