【基本原理】
歸併排序是一種遞歸算法,不斷將列表拆分爲一半。 如果列表爲空或有一個項,則按進行排序。如果列表有多個項,我們分割列表,並遞歸調用兩個半部分的合併排序。 一旦對這兩半排序完成,就執行稱爲合併的基本操作。合併是獲取兩個較小的排序列表並將它們組合成單個排序的新列表的過程。
【分析】
一分爲二的過程:類似於二分查找,時間複雜度爲O(logn)
合併過程:大小爲 n 的列表的合併操作需要 n 個操作。
歸併排序是一種 O(nlogn) 算法。
【代碼】
#合併排序,遞歸將列表一分爲二,直至不可再分;從下到上,比較,合併
def mergeSort(alist):
print('當前列表爲',alist)
if len(alist)>1:
#取中間值
mid=len(alist)//2
#中間值的左半邊,mid處取不到
lefhalf=alist[:mid]
# 中間值的右半邊
righthalf=alist[mid:]
#遞歸調用
mergeSort(lefhalf)
mergeSort(righthalf)
#設置左半邊、右半邊以及整個列表的索引
i=0
j=0
k=0
while i<len(lefhalf) and j<len(righthalf):
#判斷:左邊小於右邊,就把左邊的值付給alist[0],同時左邊索引i+1;
# 反過來,右邊的值付給alist[0],同時右邊索引j+1;循環直至有一邊不滿足條件;
if lefhalf[i]<righthalf[j]:
alist[k]=lefhalf[i]
i=i+1
else:
alist[k]=righthalf[j]
j=j+1
k=k+1
#上面循環跳出條件是有一邊遍歷列表結束;此時還有一邊沒結束,同時alist列表還缺部分數據
while i<len(lefhalf):
#接着上面的k、i賦值,i之前的值都已經賦給alist了
alist[k]=lefhalf[i]
i=i+1
k=k+1
while j<len(righthalf):
alist[k] = righthalf[j]
j=j+1
k=k+1
print('正在合併',alist)
alist = [54,26,93,17,77,31,44,55,20]
mergeSort(alist)
print(alist)
【結果】