归并排序由冯诺依曼于 1945 年发明;
采用二分的思想,对一个无序数列的最终排序,我们需要首先定义对两个已排序序列的合并算法:
def merge(l1, l2):
l3 = []
i, j = 0, 0
n1, n2 = len(l1), len(l2)
while i < n1 and j < n2:
if l1[i] <= l2[j]:
l3.append(l1[i])
i += 1
else:
l3.append(l2[j])
j += 1
if i < j:
l3.extend(l1[i:])
else:
l3.extend(l2[j:])
return l3
采用递归及二分的思想,进行最终的归并排序:
def merge_sort(l):
n = len(l)
if n < 2:
return l
m = n//2
l1 = merge_sort(l[:m])
l2 = merge_sort(l[m:])
return merge(l1, l2)
算法时间复杂度分析:
t(n)===2t(n/2)+n2(2t(n/2)+n/2)+nnlogn+n
最终的时间复杂度为: O(nlogn)