归并排序及主定理的应用

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 利用主定理计算

首先来看两个主定理的例子,以便更好地理解主定理:

接下来利用主定理计算归并排序的时间复杂度:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值