def merge_sort(a):
mid = len(a) // 2
# 当递归进入到最底层 列表只有一个元素就返回这个列表
if len(a) == 1:
return a
# 递归调用算法 返回左边的列表
left_list = merge_sort(a[:mid])
# 递归调用算法 返回右边的列表
# 以此类推 分别依次分化一个列表成两个
right_list = merge_sort(a[mid:])
#创建两个指针
left, right = 0, 0
new_list = list()
left_lenth = len(left_list)
right_lenth = len(right_list)
# 当左右指针都小于对应的列表长度就循环,否则退出
while left < left_lenth and right < right_lenth:
# 左列表和右列表进行相比,小的就放入new_list,然后对应指针加1
if left_list[left] <= right_list[right]:
new_list.append(left_list[left])
left += 1
else:
new_list.append(right_list[right])
right += 1
# 当左右两个列表有一个遍历完了, 另一个可能还有遍历完,但是剩下的元素肯定比new_list最后一个元素大
# 就将之与新list合并,由于不知道哪个列表先遍历完,所以都从指针开始切片,然后添加
new_list.extend(left_list[left:])
new_list.extend(right_list[right:])
return new_list