14 归并排序
def merge_sort(a):
n = len(a)
if n <= 1:
return a
# 二分分解 注: 切片之后会生成新的列表
pos = n // 2
left = merge_sort(a[:pos])
right = merge_sort(a[pos:])
# 合并
return merge(left, right)
def merge(left, right):
result = []
l, r = 0, 0
while l < len(left) and r < len(right):
if left[l] <= right[r]:
result.append(left[l])
l += 1
else:
result.append(right[r])
r += 1
# 退出循环后, l == len(left) 或 r == len(right) 切片形成的是空列表
result += left[l:]
result += right[r:]
return result
if __name__ == '__main__':
a = [54, 26, 93, 17, 77, 31, 44, 55, 20]
# 需要额外开销 b
b = merge_sort(a)
for i in b:
print(i, end=" ")