思想:先递归分散解组,再合成一个新的序列
# 归并排序
# 先递归分解,当长度<=1时不分解,
# 再两两一组合并,
# 当前两组内处于相同位置的值(如第一组的位置0和第二组的位置0进行比较),
# 需要另外一个空列表进行合并,
# 小的值优先放在空列表的头位
def merge_sort(alist):
# 判断不可再分的条件
# 当分解成1个的时候,不能再分
# print(len(alist))
if len(alist) == 1:
# print('只有一个值,不用拆')
return alist
else:
# print('需要拆分')
# 拆分
# 取中间值进行拆分
mid = len(alist)//2 # 整除2
# 左侧列表 从开始值到mid值
left = alist[:mid]
# 右侧列表 从mid值到最后
right = alist[mid:]
# 递归拆分
ll = merge_sort(left)
rl = merge_sort(right)
# 递归结束后,进行合并
return merge(ll,rl)
# 定义一个合并函数
def merge(left,right):
# 需要另外一个空列表进行合并,
# 小的值优先放在空列表的头位
# 辅助工具
# print('合并列表')
result = []
# print(left)
# print(right)
# 判断值
# 当前两组内处于相同位置的值
# (如第一组的位置0和第二组的位置0进行比较),
# 当列表left,right任然有值的时候,才执行if语句
while len(left)>0 and len(right)>0:
print('进入循环')
if left[0] <= right[0]:
# print('左值小,先出去')
result.append(left.pop(0))
# print('左列表:')
# print(left)
# print(result)
else:
# print('右值小,先出去')
result.append(right.pop(0))
# print(result)
# print(result)
# 执行完while语句后,
# 里面没有已经数据,直接添加剩下的值
result += left
result += right
return result
if __name__ == '__main__':
list = [1,16,20,30,40,4]
# print(len(list))
list2 = merge_sort(list)
print(list2)