总的来说归并排序就是把原序列都拆分为单个的元素,然后从单个的元素开始进行按照大小合并到中间list中,排序完成。
这里的拆分比较容易,重点讲解合并
# _*_ encoding:utf-8_*_
# 主函数,拆分
def merger_sort(lists):
mid = len(lists) // 2 # 取中间元素下标
if mid < 1: # 说明元素只剩一个,无法拆分
return lists
left_list = lists[:mid] # 把lists分为两部分
right_list = lists[mid:]
left = merger_sort(left_list) # 再拆分
right = merger_sort(right_list)
return merger(left,right) # 合并
# 合并
def merger(left,right):
result = [] # 存放合并排序后的元素
# 这里是进行比对两个list中的数据,按照大小放入到公共list中
# 两个list需要同时不为空才能比较两者中的数据,
# 每次把元素存放到中间list,都需要把原list中的元素剔除,用pop很合适
while left and right:
# 把较小的数据弹出放到result中
if left[0] <= right[0]:
result.append(left.pop(0))
else:
result.append(right.pop(0))
# 把比较剩余的元素放入到公共list末尾,
# 比较剩余的元素肯定是排列好顺序的,并且是较大的值,
# 这里left和right肯定有一个为空,所以就放到一起合并list
return result + left + right
lt = [3,55,1,6,11,7,4]
print merger_sort(lt)
文章中有不足之处请多多指教,欢迎讨论,共同学习,共同进步
参考:
https://www.runoob.com/w3cnote/merge-sort.html