昨天學習了遞迴 (Rcursion),今天來學習可以用遞迴實作的合併排序 (Merge Sort)。
假設我們現在有一串資料需要排序 [5, 2, 1, 7, 8, 3, 9, 6]
結果:[5]、[2]、[1]、[7]、[8]、[3]、[9]、[6]
再來就要把他們全部合併起來
結果:[2, 5]、[1, 7]、[3, 8]、[6, 9]
[2, 5] + [1, 7] →
[3, 8] + [6, 9] →
結果:[1, 2, 5, 7]、[3, 6, 8, 9]
[1, 2, 5, 7] + [3, 6, 8, 9] →
結果:[1, 2, 3, 5, 6, 7, 8, 9] (完成排序!)
def merge(left, right):
# 要加入的新陣列
merged = []
# index
i = 0
j = 0
while i < len(left) and j < len(right):
if left[i] <= right[j]: # 保持穩定排序
merged.append(left[i])
i += 1 # 換下一筆
else:
merged.append(right[j])
j += 1 # 換下一筆
# 將剩下的加入
merged.extend(left[i:])
merged.extend(right[j:])
return merged
def merge_sort(array):
# 遞迴進行合併排序
if len(array) <= 1: # 切到最小長度 1
return array
mid = len(array) // 2 # 取整數,如果長度是 7,就會切成 3、4
left = merge_sort(array[:mid]) # 左半排序 (遞迴)
right = merge_sort(array[mid:]) # 右半排序 (遞迴)
return merge(left, right) # 合併
data = [5, 2, 1, 7, 8, 3, 9, 6]
print(merge_sort(data))
謝謝!
參考資料
增井敏克,《圖解演算法原理》,碁峰資訊,2023 年
ChatGPT