文章目录
1、 归并排序(MergeSort)
1.1 归并算法的排序过程
归并排序算法是分治法的典型应用,具体排序过程如下:
每次合并过程中,是将两个分组里的数从第一个数开始比较,把数字较小的放入容器(升序排列)。
以第二次合并过程为例:
1.2 用Python实现归并排序
def merge(a, b): # 从小到大合并两个有序列表
c = []
j = k = 0
while j < len(a) and k < len(b):
if a[j] < b[k]:
c.append(a[j])
j += 1
else:
c.append(b[k])
k += 1
if j == len(a):
for i in b[k:]:
c.append(i)
else:
for i in a[j:]:
c.append(i)
return c
def MergeSort(lists): # 利用递归的思想进行归并排序
if len(lists) <= 1:
return lists
middle = len(lists) // 2
left = MergeSort(lists[: middle])
right = MergeSort(lists[middle:])
return merge(left, right)
if __name__ == '__main__':
a = [9, 5, 2, 8, 4, 6, 1, 3, 7]
b = MergeSort(a)
print(b)
1.3 归并排序的空间及时间复杂度
归并算法渗透着递归的思想,它在不断的递归拆分数据的过程中会占用栈的空间,其空间复杂度为O(n)。
它的时间复杂度为O(nlogn),那么如何计算它的时间复杂度呢?本文之后的内容将通过主算法推导计算归并排序的时间复杂度的方法。
2、主定理(Master Theorem)
2.1 主定理的内容:
2.2 利用主定理计算
首先来看两个主定理的例子,以便更好地理解主定理:
接下来利用主定理计算归并排序的时间复杂度: