Python 归并排序实现详解与核心代码

Dylan
Dylan
发布时间:2026-10-11| 1人浏览过
原创

归并排序是一种基于分治策略的稳定排序算法,通过递归将序列不断拆分为单元素子序列,再逐步合并回有序状态。本文详细拆解划分、递归调用与双指针合并的具体步骤,并提供经过验证的 Python 核心代码,帮助开发者快速理解其底层逻辑并完成实际测试。

归并排序的核心逻辑

归并排序(MERGE-SORT)建立在归并操作上,核心遵循分治(Divide-and-Conquer)原则。它将原问题划分为规模更小的子问题独立求解,随后将结果拼接合并。具体到数据排序时,先将无序列表切分为极小的有序片段,再通过两两对比的方式将这些片段重新组合,最终形成完整的有序序列。

算法执行步骤拆解

整个流程可严格划分为三个连续阶段:

第1步:划分区间(分解)

目的:将待排序序列缩小至可独立处理的粒度。
入口:接收任意长度的列表或数组对象。
动作:计算中点索引 mid = len(arr) // 2,使用切片语法生成左半区 L = arr[:mid] 与右半区 R = arr[mid:]。
重要参数:整除运算符 // 确保索引始终为整数。
完成状态:原始数组被准确切割为两个新列表,当子列表长度等于 1 时触发基线条件,停止进一步分割。

第2步:递归排序子区间

目的:确保左右两部分各自内部保持升序排列,为后续合并奠定基础。
入口:上一步生成的 L 和 R。
动作:对两个子列表再次调用本函数,利用调用栈逐层深入直至最底层单元素节点,随后在回溯阶段进入合并环节。
完成状态:左右分区均转化为已排序数组,递归栈展开完毕,控制权回归至当前层级的合并逻辑。

第3步:双指针合并有序段

目的:将两段有序数据融合为单一有序序列,保证元素不丢失且相对位置稳定。
入口:已排序的 L、R 以及用于存放结果的原始数组容器。
动作:初始化索引指针 i = j = k = 0。执行循环 while i < len(L) and j < len(R),每次比对 L[i] 与 R[j],将较小值赋给 arr[k] 并推进对应左侧或右侧指针,同时主索引 k 自增。
重要参数:需处理边界溢出。循环结束后,分别使用独立 while 将未耗尽区间的剩余项直接追加到 arr 末尾,避免漏写数据。
完成状态:当前层级的合并闭环完成,k 达到当前区间总长度,向上返回层级继续执行相同逻辑。

Python 代码实现与运行验证

以下为可直接复制到 Python 环境执行的完整脚本。代码严格遵循上述步骤,采用切片创建临时列表配合原地覆盖的方式实现,兼顾可读性与标准算法逻辑。

def merge_sort(arr):
    if len(arr) > 1:
        mid = len(arr) // 2  # 找到中间索引
        L = arr[:mid]  # 左半部分
        R = arr[mid:]  # 右半部分

        merge_sort(L)  # 递归地排序左半部分
        merge_sort(R)  # 递归地排序右半部分

        # 合并两个有序数组
        i = j = k = 0

        # 复制数据到临时数组L[]
        while i < len(L) and j < len(R):
            if L[i] < R[j]:
                arr[k] = L[i]
                i += 1
            else:
                arr[k] = R[j]
                j += 1
            k += 1

        # 复制左半部分剩余的数据
        while i < len(L):
            arr[k] = L[i]
            i += 1
            k += 1

        # 复制右半部分剩余的数据
        while j < len(R):
            arr[k] = R[j]
            j += 1
            k += 1

# 测试代码
arr = [12, 11, 13, 5, 6, 7]
print("未排序的数组:", arr)
merge_sort(arr)
print("排序后的数组:", arr)

运行结果核对:脚本执行后控制台首先输出未排序的初始序列,调用 merge_sort(arr) 后再次打印,预期显示按升序排列的结果 [5, 6, 7, 11, 12, 13]。若输出顺序不符,请重点检查指针递增位置是否错位,或遗漏了尾部元素的拷贝分支。

完成判断与简要总结

验证代码无误的标准是处理包含重复值、负数或长序列的输入后,返回结果完全符合升序定义且无任何元素丢失。归并排序依靠稳定的递归拆分与精确的双指针比对保障正确性,时间复杂度恒定在 O(n log n),适合对稳定性有要求或数据量较大的场景。以上就是 Python 归并排序原理与代码实现的详细内容,更多关于算法基础与排序技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。