歸並排序是建立在歸並操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合並,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合並成一個有序表,稱為2-路歸並。
算法描述
- 把長度為n的輸入序列分成兩個長度為n/2的子序列;
- 對這兩個子序列分別采用歸並排序;
- 將兩個排序好的子序列合並成一個最終的排序序列
def mergeSort(alist):
"""歸並排序(穩定|nlgn)"""
n = len(alist)
if n <= 1:
return alist
mid = n//2
#left 采用歸並排序后形成新的有序列表
left_li = mergeSort(alist[:mid])
#right 采用歸並排序后形成新的有序列表
right_li = mergeSort(alist[mid:])
#merge(left, right) 將兩個有序的子序列合並為一個新的整體
left_pointer, right_pointer = 0, 0
result = []
while left_pointer < len(left_li) and right_pointer<len(right_li):
if left_li[left_pointer] < right_li[right_pointer]:
result.append(left_li[left_pointer])
left_pointer += 1
else:
result.append(right_li[right_pointer])
right_pointer += 1
result += left_li[left_pointer:]
result += right_li[right_pointer:]
return result