def merge(li, low, mid, high): # 需要mid左右两边的列表是有序的
i = low
j = mid + 1
ltmp = []
while i <= mid and j <= high: # 左右两边都要有数
if li[i] < li[j]:
ltmp.append(li[i])
i += 1
else:
ltmp.append(li[j])
j += 1
# while执行完,肯定有一部分没数了
while i <= mid:
ltmp.append(li[i])
i += 1
while j <= high:
ltmp.append(li[j])
j += 1
li[low:high + 1] = ltmp
def merge_sort(li, low, high): # 利用递归将原列表分解成一段段小列表
if low < high: # 至少有两个元素,递归
mid = (low + high) // 2
merge_sort(li, low, mid)
merge_sort(li, mid+1, high)
print(li[low:high + 1])
merge(li, low, mid, high) # 将小列表合并排序
li = list(range(20))
import random
random.shuffle(li)
print(li, "原列表")
merge_sort(li, 0, len(li)-1)
print(li, "排序后")