[低端筆記] 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
  1. If n = 1, done (nothing to sort)
  2. recursively sort A[ 1 . . n/2 ], A[ n/2+1 . . n ] 
  3. 合併兩個排序完成的sub-arrays

#複雜度分析

各步驟複雜度
  1. Θ(1)
  2. 2T(n/2) 
  3. Θ(n) 
T(n) = Θ(1) if n = 1;
       = 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)

花費時間比較

Merge Sort in python: 2.2nlgn µs
Insertion sort in python: 0.2n^2 µs
Insertion sort in C: 0.01n^2 µs

延伸閱讀
About Sean Chaox
Me

I'm soulless, so I'm recompiling my soul
I'm lifeless, so I'm enriching my life
I'm homeless, so I build this House
I am Sean, welcome to my House

沒有留言:

張貼留言