当前位置: 首页 > news >正文

Python 实现归并排序:从原理到代码

归并排序(Merge Sort)是一种经典的排序算法,以其稳定的性能和分治的思想而广受欢迎。它的时间复杂度为 (O(n \log n)),在实际应用中表现非常出色,尤其是在处理大数据集时。今天,就让我们一起深入学习归并排序的原理,并用 Python 实现它。

一、归并排序的原理

归并排序是一种分治算法,它通过将数组分成两部分,分别对这两部分进行排序,然后将排序后的两部分合并成一个有序数组。归并排序的核心在于“合并”操作,即将两个有序数组合并成一个有序数组。

(一)排序过程

  1. 分解:将数组分成两部分,直到每个部分只有一个元素。
  2. 合并:将两个有序数组合并成一个有序数组。
  3. 递归:递归地对每个部分进行归并排序,直到整个数组排序完成。

(二)示例

假设我们有一个数组 [3, 6, 8, 10, 1, 2, 1],归并排序的过程如下:

  1. 分解:

    • [3, 6, 8][10, 1, 2, 1]
    • [3][6, 8][10][1, 2, 1]
    • [3][6][8][10][1][2, 1]
    • [3][6][8][10][1][2][1]
  2. 合并:

    • [3][6][3, 6]
    • [8][10][8, 10]
    • [1][2][1, 2]
    • [1][1, 2][1, 1, 2]
    • [3, 6][8, 10][3, 6, 8, 10]
    • [1, 1, 2][3, 6, 8, 10][1, 1, 2, 3, 6, 8, 10]

二、Python 实现归并排序

(一)基本实现

以下是用 Python 实现归并排序的代码:

def merge_sort(arr):if len(arr) <= 1:return arr# 分解mid = len(arr) // 2left = merge_sort(arr[:mid])right = merge_sort(arr[mid:])# 合并return merge(left, right)def merge(left, right):result = []i = j = 0while i < len(left) and j < len(right):if left[i] < right[j]:result.append(left[i])i += 1else:result.append(right[j])j += 1result.extend(left[i:])result.extend(right[j:])return result# 测试代码
arr = [3, 6, 8, 10, 1, 2, 1]
sorted_arr = merge_sort(arr)
print("排序后的数组:", sorted_arr)

(二)优化实现

虽然上述实现已经非常高效,但我们可以进一步优化合并操作,使其更加简洁和高效。

def merge_sort(arr):if len(arr) <= 1:return arrmid = len(arr) // 2left = merge_sort(arr[:mid])right = merge_sort(arr[mid:])return merge(left, right)def merge(left, right):result = []i = j = 0while i < len(left) and j < len(right):if left[i] < right[j]:result.append(left[i])i += 1else:result.append(right[j])j += 1result.extend(left[i:])result.extend(right[j:])return result# 测试代码
arr = [3, 6, 8, 10, 1, 2, 1]
sorted_arr = merge_sort(arr)
print("排序后的数组:", sorted_arr)

三、归并排序的性能分析

(一)时间复杂度

  • 平均情况:(O(n \log n)),每次分解都将数组分成两部分,合并操作的时间复杂度为 (O(n))。
  • 最坏情况:(O(n \log n)),归并排序的时间复杂度在所有情况下都是 (O(n \log n))。
  • 最好情况:(O(n \log n)),归并排序的时间复杂度在所有情况下都是 (O(n \log n))。

(二)空间复杂度

归并排序需要额外的空间来存储分解后的数组,空间复杂度为 (O(n))。虽然归并排序不是原地排序算法,但它的稳定性和高效性使其在实际应用中非常受欢迎。

(三)稳定性

归并排序是一种稳定的排序算法,即相等的元素在排序后仍然保持原来的顺序。

四、总结

通过本文的介绍,你已经掌握了归并排序的原理和 Python 实现方法。以下是关键点总结:

  • 原理:通过分解数组,递归地对每个部分进行排序,然后将排序后的部分合并成一个有序数组。
  • 实现:使用递归实现归并排序,通过优化合并操作提高效率。
  • 性能分析:时间复杂度为 (O(n \log n)),空间复杂度为 (O(n)),是一种稳定的排序算法。

归并排序在实际应用中表现非常出色,尤其是在处理大数据集时。希望这篇文章能帮助你更好地理解归并排序。

http://www.dtcms.com/a/355298.html

相关文章:

  • Ansys Electronics Desktop 2025 R2 软件界面介绍
  • open webui源码分析10-四个特征之搜索
  • 系统架构师-软件工程
  • 前端响应式设计
  • 推荐系统王树森(五)重排多样性提升
  • 银河麒麟桌面操作系统:为什么不让root直接登录图形界面?以及如何安全地解决这个问题
  • 英伟达营收和利润均超出市场预期,但盘后一度跌超5%
  • Groovy语法入门
  • [光学原理与应用-321]:皮秒深紫外激光器产品不同阶段使用的工具软件、对应的输出文件
  • 客户案例 | 国际知名内衣品牌x甄知科技,领航IT服务新征程
  • linux 网络:并发服务器及IO多路复用
  • 开发避坑指南(42):Vue3 element ui el-table单选实现方案
  • HTML静态页面实现材积计算器和材积表生成器
  • 动手学深度学习(pytorch版):第七章节—现代卷积神经网络(5)批量规范化
  • 吴炳锡:AI 时代下的湖仓一体化平台建设的思考
  • 从枯燥C++到趣味音乐:我的Windows系统底层探索之旅
  • 公共字段自动填充
  • Foundry工具大全
  • uniapp vue3 canvas实现手写签名
  • 【Node.js从 0 到 1:入门实战与项目驱动】2.4 开发工具推荐(VS Code 、IDEA及插件、终端工具、调试工具)
  • Cesium入门教程(二)环境搭建(HTML版)
  • QT:【第一个QT程序】【信号和槽】
  • 使用uni-app和Canvas生成简易双列表格布局并长按下载到本地
  • 混淆 打包 编译
  • Ovis2.5技术解密:原生分辨率与“反思模式”如何铸就新一代MLLM王者
  • 2024年山东省信息学小学组(CSP-X)第一轮题解
  • 冒泡排序算法详解(python code)
  • Python训练营打卡 DAY 50 预训练模型+CBAM模块
  • Shell 编程基础与实践要点梳理
  • PCIe 5.0 SSD连续读写缓存用完速度会骤降吗?