13-归并排序-分治策略应用于排序

# 归并排序是递归算法,思路是将数据表持续分裂为两半,对两半分别进行归并排序
# 递归的基本结束条件是:数据表仅有1个数据项,自然是排好序的
# 缩小规模:将数据表分裂为相等的两半,规模减为原来的二分之一;
# 用自身:将两半分别调用自身排序,然后将分别排好序的两半进行归并,得到排好序的数据表
# 将归并排序分为两个过程来分析:分裂 和归并
# 分裂的过程,借鉴二分查找中的分析结果,是对数复杂度,时间复杂度为O(logn)
# 归并的过程,相对于分裂的每个部分,其所有数据项都会被比较和放置一次,所以是线性复杂度,其时间复杂度是O(n)
# 综合考虑,每次分裂的部分都进行一次O(n)的数据项归并,总的时间复杂度是O(nlogn)


def merge_sort(alist):
    # 递归结束条件
    if len(alist) <= 1:
        return alist
    # 分解问题并递归调用
    middle = len(alist) // 2
    left = merge_sort(alist[:middle])
    right = merge_sort(alist[middle:])
    # 合并左右,完成排序
    merged = []
    while left and right:
        if left[0] <= right[0]:
            merged.append(left.pop(0))
        else:
            merged.append(right.pop(0))
    merged.extend(right if right else left)
    return merged  # 注意递归有返回值,返回的是排好序的列表


testlist = [2, 3, 3, 243, 24, 24455, 23]
print(merge_sort(testlist))

作者:lotuslaw

出处:https://www.cnblogs.com/lotuslaw/p/13968819.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   lotuslaw  阅读(92)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示