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

排序算法归并排序

归并排序详解

归并排序(Merge Sort)是一种 ​​分治算法​​,核心思想是将数组不断拆分为更小的子数组排序,再合并成有序数组。时间复杂度始终为 ​O(n log n)​,稳定且效率高。


工作步骤:

  1. ​分解​​:将数组从中点分为左右两部分
  2. ​递归​​:对左右子数组分别递归排序
  3. ​合并​​:将两个有序子数组合并为一个有序数组

案例:整理扑克牌

假设你有两堆已排序的扑克牌(左堆:[3, 5], 右堆:[1, 8])需合并为一副有序牌:

  1. 比较两堆顶部的牌:左堆3 > 右堆1 → 取1放到新堆
  2. 再比较:左堆3 < 右堆8 → 取3
  3. 左堆剩5 < 8 → 取5
  4. 最后取右堆剩余的8 → 新堆[1, 3, 5, 8]

Python 代码实现

def merge_sort(arr):# 递归终止条件:单元素或空数组if len(arr) <= 1:return arrmid = len(arr) // 2# 分解为左右子数组(递归排序)left = merge_sort(arr[:mid])right = merge_sort(arr[mid:])# 合并两个有序子数组return merge(left, right)def merge(left, right):result = []i = j = 0# 双指针遍历左右数组while i < len(left) and j < len(right):if left[i] <= right[j]:result.append(left[i])i += 1else:result.append(right[j])j += 1# 添加剩余元素result.extend(left[i:])result.extend(right[j:])return result# 测试示例
if __name__ == "__main__":array = [38, 27, 43, 3, 9, 82, 10]print("原始数组:", array)sorted_array = merge_sort(array)print("排序结果:", sorted_array)

输出示例:

原始数组: [38, 27, 43, 3, 9, 82, 10]
排序结果: [3, 9, 10, 27, 38, 43, 82]

算法关键点

  1. ​稳定性​​:left[i] <= right[j] 保证相等元素顺序不变
  2. ​空间代价​​:需额外 O(n) 空间存储合并结果
  3. ​高效场景​​:大数据量排序(远超冒泡/插入排序)

💡 ​​现实应用​​:数据库排序、外排序(处理超大数据)
🔄 分治思想同样适用于快速排序,但归并的稳定性是其独特优势。


做题

我们需要对数组 a = {6, 5, 4, 3, 2, 1, 8, 8} 进行归并排序(升序),并找出​​完成最终归并排序的前一步的结果​​。


归并排序的基本步骤

  1. ​分解​​:将数组递归地分成两半,直到每个子数组只有一个元素
  2. ​合并​​:将两个已排序的子数组合并成一个有序数组

具体过程

初始数组:[6, 5, 4, 3, 2, 1, 8, 8]

  1. 第一次分解:

    • 左半部分:[6, 5, 4, 3]
    • 右半部分:[2, 1, 8, 8]
  2. 对左半部分 [6, 5, 4, 3] 分解:

    • 左:[6, 5] → 排序后:[5, 6]
    • 右:[4, 3] → 排序后:[3, 4]
    • 合并:[5, 6][3, 4][3, 4, 5, 6]
  3. 对右半部分 [2, 1, 8, 8] 分解:

    • 左:[2, 1] → 排序后:[1, 2]
    • 右:[8, 8] → 排序后:[8, 8]
    • 合并:[1, 2][8, 8][1, 2, 8, 8]
  4. ​最终合并的前一步​​:

    • 左半部分已排序:[3, 4, 5, 6]
    • 右半部分已排序:[1, 2, 8, 8]
    • 下一步是将 [3, 4, 5, 6][1, 2, 8, 8] 合并为 [1, 2, 3, 4, 5, 6, 8, 8]

因此,​​完成最终归并排序的前一步的结果​​是:

  • 左半部分:[3, 4, 5, 6]
  • 右半部分:[1, 2, 8, 8]

选项匹配

  • 2, 1, 8, 8, 6, 5, 4, 3:错误,未体现归并排序的合并过程。
  • 3, 4, 5, 6, 1, 2, 8, 8:正确,这是左半部分和右半部分分别排序后的结果。
  • 1, 2, 3, 4, 5, 6, 8, 8:错误,这是最终排序结果,不是前一步。
  • 6, 5, 4, 3, 2, 1, 8, 8:错误,这是初始数组。

正确答案:​​Ⓑ 3, 4, 5, 6, 1, 2, 8, 8​

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

相关文章:

  • HarmonyOS应用开发环境搭建以及快速入门介绍
  • OpenAI隆重推出开源大模型:GPT-OSS
  • 面试题:基础的sql命令
  • Java NIO
  • 从 LinkedIn 到 Apache:Kafka 的架构设计与应用场景
  • 【25-cv-08899/08985】Lisa Audit 23张版权画作暴雷,Keith律所双案并发冻结跨境店铺!
  • Numpy科学计算与数据分析:Numpy入门之多平台安装与基础环境配置
  • Python 自动化与 Web 应用开发详细教案
  • 前端全栈修炼手册:从 Vue3 到工程化的进阶之路
  • Ethereum: 深入Hardhat Console, 我们的智能合约瑞士军刀
  • 微型导轨:智能家居抽屉的智能化应用
  • Text2SQL 智能问答系统开发-spider验证集(三)
  • 线程互斥与同步
  • C语言控制语句练习题1
  • 汽车以太网通信协议——SOME/IP
  • JTAG-SVF文件完整教程
  • 身份证实名认证接口增强联网平台的便利性与安全性
  • Centos上安装Mysql5.7教程
  • 智能提示词引擎的革新与应用:PromptPilot使用全解析
  • Bug 记录:SecureRandom.getInstanceStrong()导致验证码获取阻塞
  • 算法238. 除自身以外数组的乘积
  • 完整的登陆学生管理系统(配置数据库)
  • VSCode git提交记录中文commit显示乱码
  • 碰撞问题的分析
  • OpenAI开源大模型gpt-oss系列深度解析:从120B生产级到20B桌面级应用指南
  • C++实现线程池(3)缓存线程池
  • get请求中文字符参数乱码问题
  • 互联网一线大厂Java面试八股文整理(1000题附答案)
  • MATLAB深度学习之数据集-数据库构建方法详解
  • Leetcode——209. 长度最小的子数组