算法描述分析:
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
这是官方一点的对于归并排序的定义,简单的来说,我们把要排序的列表或者数组,每一次都给它递归生成n/2有序列表
我们拿例子来看:
有这样一个列表我们按照分治思想,先将它分为俩组
按照这个思路,我们继续将列表分下去
当我们通过递归分到只剩一个元素时,将俩边的元素进行合并成有序的一个列表
接着其他递归出口也将对应的子列表,合并好
一层层向上合并
最后合并成一个列表
复杂度分析:
排序算法时间复杂度的比较图 转载:https://blog.csdn.net/weixin_40596016/article/details/79711682
python 代码:
# -*- coding: utf-8 -*-
"""
Created on
@author: Administrator
"""
#优化了网上对于合并的函数的复杂,pyhton的宗旨
#简洁胜过复杂
#Complex is better than complicated.
#利用列表性质
def merge(leftList,rightList):
merges = []
while leftList and rightList: #谁先出完循环结束
if leftList[-1] >= rightList[-1]: #将排序好的俩个列表从后放,谁最大谁放在后面
merges.insert(0,leftList[-1])
leftList.pop()
else :
merges.insert(0,rightList[-1])
rightList.pop()
merges=leftList+rightList+merges #剩余相加即可,切记剩余的是小数要放在前面
return merges
def mergesort(a):
if len(a)<=1:
return a
mid = len(a)//2
rightList=mergesort(a[:mid])
leftList=mergesort(a[mid:])
return merge(leftList,rightList)
a=[2,15,30,2,5,9,6]
print (mergesort(a))