归并排序
“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表。假设初始序列有n个有序的子序列,每个序列的长度为1,然后两两归并,得到
n2
n
2
个长度为2或1的有序子序列,再两两归并…,如此重复,直到得到一个长度为n的有序序列为止。
归并排序的时间复杂度在
O(nlogn)
O
(
n
l
o
g
n
)
。我们下面直接给个直观的例子看看他是怎么操作的,2-路归并排序:
下面我们给出他的Python代码(Python3.6)实现:
# -*- coding: utf-8 -*-
def merge(a, b):
# 此函数用来归并a,b;通过比较a与b元素的大小,将a,b合并成一个List
len_a = len(a)
len_b = len(b)
i, j = 0, 0
result = [] # result用来存储a,b合并后的结果,按升序
while i < len_a and j < len_b:
if a[i] < b[j]:
result.append(a[i])
i += 1
else:
result.append(b[j])
j += 1
if i == len_a: #如果i与a的长度相等,说明a中全部元素已进入result,此时只要将b中剩余元素进入result即可
for k in b[j:]:
result.append(k)
else:# 将a中剩余元素进入result
for k in a[i:]:
result.append(k)
return result
def merge_sort(alist):
# 将alist一分为2后,再递归地一分为2,然后再用merge函数两两归并
len_alist = len(alist)
if len_alist <= 1:
return alist
else:
m = int(len_alist/2)
left = merge_sort(alist[:m])
right = merge_sort(alist[m:])
return merge(left, right)
if __name__ == '__main__':
a = [4, 7, 8, 3, 5, 9]
print(merge_sort(a))
程序运行结果为:[3, 4, 5, 7, 8, 9]
博主的Github地址:请点击这里