几种排序算法总结(五)--归并排序

本文详细介绍了归并排序算法,这是一种基于分治法的典型应用,具有稳定的O(nlogn)时间复杂度。算法通过递归或迭代将列表分为两部分,然后合并排序。归并排序过程包括申请额外空间、比较元素、合并序列等步骤。提供的代码示例展示了如何使用Python实现归并排序。
归并排序(Merge sort)该算法是采用分治法(Divide and Conquer)的典型应用。

作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:
1. 自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 2 种方法);
2. 自下而上的迭代;

和选择排序一样,归并排序的性能不受输入数据的影响,始终都是 O(nlogn) 的时间复杂度;需要额外的内存空间。

算法步骤
申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;
设定两个指针,最初位置分别为两个已经排序序列的起始位置;
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
重复步骤 3 直到某一指针达到序列尾;
将另一序列剩下的所有元素直接复制到合并序列尾。

def merge_sort(sample: list):
    '''
    划分列表为左右两个部分,指导左右两部分都只有一个值
    再讲左右两部分输入merge函数
    递归调用
    :param sample:
    :return:
    '''
    if len(sample) < 2:
        return sample

    middle = math.floor(len(sample) / 2)
    left, right = sample[0: middle], sample[middle:]

    return merge(merge_sort(left), merge_sort(right))

def merge(left, right):
    result = []
    while left and right:
        if left[0] <= right[0]:
            result.append(left.pop(0))
        else:
            result.append(right.pop(0))

    while left:
        result.append(left.pop(0))
    while right:
        result.append(right.pop(0))

    return result

参考:https://www.cnblogs.com/kaibindirver/p/12093823.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值