归并排序
归并排序(merge sort)是分治策略的一种实现,具体来说,它将序列一分为二,分别的对子序列递归排序,最后合并有序子序列。
归并排序的核心是合并(merge)操作,即二路归并(2-way merge),指将两个有序序列合并为一个有序序列:S[lo, hi) = S[lo, mi) + S[mi, hi)。
合并时只需比较两个有序序列的第一个元素的大小即可。
def merge(left, right):
result = []
while left and right:
if left[0] <= right[0]:
result.append(left.pop(0))
else:
result.append(right.pop(0))
if left:
result += left
if right:
result += right
return result
def mergesort(lis): # [lo, hi)
if len(lis) < 2: # 单元素区间自然有序,否则...
return lis
mi = len(lis) >> 1 # 以中点为界
left = mergesort(lis[:mi]) # 对前半段排序
right = mergesort(lis[mi:]) # 对后半段排序
return merge(left, right) # 归并
# 测试
lis = [4, 3, 8, 7, 1, 9, 6]
print(mergesort(lis)) # [1, 3, 4, 6, 7, 8, 9]
归并排序的最坏时间复杂度为 \(O(nlogn)\)。
LeetCode:21. 合并两个有序链表