归并排序:
基本思路:两个有序列表,相继取最小的数,合并出来的列表一定是有序的。
做法:将列表对半分开,一直分到没法再分位置,只有1个元素的列表一定是有序的。再依次进行归并排序。
时间复杂度:O(n*log(2,n))
空间复杂度:O(n+log(2,n))
归并排序python代码:
def merge_sort(li):
if len(li) <=1:
return li
else:
mid = len(li)//2
left = merge_sort(li[:mid])
right = merge_sort(li[mid:])
res = []
while left and right:
if left[0] <= right[0]:
res.append(left.pop(0))
else:
res.append(right.pop(0))
res.extend(left if left else right)
return res
归并排序python代码注释:
def merge_sort(li):#归并排序
if len(li)<=1:#如果只剩下一个元素或者0个元素,它自然有序,直接返回即可。
return li
middle=len(li)//2#判断li的中间位置。
left=merge_sort(li[0:middle])
right=merge_sort(li[middle:])
res=[]#初始化结果列表
while left and right:#对比两个有序列表中最小的值(也就是第一个值)
if left[0]<right[0]:
res.append(left.pop(0))#选择较小的元素加入到结果列表中。并从原列表中踢出来。
else:
res.append(right.pop(0))#选择较小的元素加入到结果列表中。并从原列表中踢出来。
res.extend(left if left else right)#倒入剩下的元素。
return res
注意,
/* left=merge_sort(li[0:middle])
right=merge_sort(li[middle:])
*/
先将列表对半分开,一直分到没法再分位置,只有1个元素的列表一定是有序的;
/*
while left and right:
if left[0] <= right[0]:
res.append(left.pop(0))
else:
res.append(right.pop(0))
res.extend(left if left else right)
*/
再讲列表再依次进行归并排序。