https://www.bilibili.com/video/av17888875?from=search&seid=17019827770934522690
归并排序算法的时间复杂度:O(NlogN)
假设使用归并排序算法排序好规模为N的列表需要时间为T(N),则是用归并排序算法的细节是:将长度为N的列表划分成2个长度为N/2的列表,分别使用归并排序算法排序好将消耗时间2*T(N/2),再将两个排序好的有序子序列进行归并(merge),归并的过程就是不断的比较和消去,将2个长度为N/2的列表归并所需要消耗的时间复杂度就等于两个子列表中的元素个数N为O(N),最终得到排序好的列表。
则计算复杂度的递推公式为:
T(N)=2*T(N/2)+O(N)
解为 T(N)=O(Nlog(N))
'''
python中归并排序算法的实现(递归实现)
'''
def merge_sort(array):
# print(array)
n=len(array)
if n==1:
return array
mid=n//2
left=merge_sort(array[:mid])
right=merge_sort(array[mid:])
return merge(left,right)
def merge(left,right):
out=[]
while left and right:
p1=left[0]
p2=right[0]
if p1<=p2:
out.append(left.pop(0))
else:
out.append(right.pop(0))
if left:
out.extend(left)
#注意,这里left最后剩下的元素可能不止一个,使用extend使得将列表中的所有元素添加到out列表中
#不能写成out.append(left)
#还可以写成out+=left
if right:
out.extend(right)
return out
if __name__=='__main__':
a=[54,26,93,17,77,31,44,55,20]
assert merge_sort(a)==sorted(a)
print(merge_sort(a))
'''
https://www.bilibili.com/video/av17888875/?p=2
函数的嵌套调用/递归调用的执行过程:就是不断改变函数的输入实参,等待返回值,从而能够返回上一级调用的过程
递归算法的执行过程:(每次调用merge_sort函数的时候,代码执行顺序就是读代码的顺序)
merge_sort([54,26,93,17,77,31,44,55,20])
mid=4
left=merge_sort([54,26,93,17])#进入下一级调用,等待返回值
mid=2
left=merge_sort([54,26])#进入下一级调用
mid=1
left=merge_sort([54])
n=1
return [54]
left=[54]#得到返回值之后,退回到上一级调用过程
right=merge_sort([26])
n=1
return [26]
right=[26]#得到返回值
进行在当前级别中的排序代码段(将两个分别排序好的列表合并成一个大的排序好的列表)
merge(left,right)=[26,54],返回上一级调用
left=[26,54]返回调用
right=merge_sort([93,17])
mid=1
left=merge_sort([93])
n=1
return [93]
返回值left=[93]
right=merge_sort([17])
n=1
return [17]
返回值right=17
merge([93],[17])
返回值[17,93]
返回值right=[17,93]
merge(left=[26,54],right=[17,93])
将返回值[17,26,54,93]返回上一级调用
返回值left=[17,26,54,93]
进入当前调用的下一行代码
right=merge_sort([77,31,44,55,20])
调用过程类似,得到返回值
right=[20,31,44,55,77]
然后将left=[17,26,54,93]和right=[20,31,44,55,77]合并
得到[17, 20, 26, 31, 44, 54, 55, 77, 93]
返回 [17, 20, 26, 31, 44, 54, 55, 77, 93]
'''