news 2026/9/25 19:29:52

归并排序(Merge Sort)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
归并排序(Merge Sort)

归并排序核心思想

分治法(Divide and Conquer)

  • 分解:将数组从中间分成两半
  • 解决:递归地对两半分别排序
  • 合并:将两个有序数组合并成一个有序数组

图解示例

假设待排序数组:[8, 4, 5, 7, 1, 3, 6, 2]

第一阶段:分解(递归拆分)

[8,4,5,7,1,3,6,2] ← 原始数组 (0-7) ↓ ┌────────────┴────────────┐ [8,4,5,7] [1,3,6,2] ← mid=3,分成两半 ↓ ↓ ┌────┴────┐ ┌────┴────┐ [8,4] [5,7] [1,3] [6,2] ↓ ↓ ↓ ↓ ┌─┴─┐ ┌─┴─┐ ┌─┴─┐ ┌─┴─┐ [8] [4] [5] [7] [1] [3] [6] [2] ← 递归终止(只剩1个元素) ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ [4,8] [5,7] [1,3] [2,6] ← 开始合并(每层合并) ↓ ↓ ↓ ↓ [4,5,7,8] [1,2,3,6] ← 继续向上合并 ↓ ↓ [1,2,3,4,5,6,7,8] ← 最终有序数组

第二阶段:合并过程详解

以合并[4,8]和[5,7]为例:

左数组 [4, 8] 右数组 [5, 7] 临时数组 [] ↑ ↑ i (left) j (mid+1) 步骤1: 4 ≤ 5? 是 → temp[0] = 4, i++, k++ 左 [4, 8] 右 [5, 7] temp [4] ↑ ↑ i j 步骤2: 8 ≤ 5? 否 → temp[1] = 5, j++, k++ 左 [4, 8] 右 [5, 7] temp [4, 5] ↑ ↑ i j 步骤3: 8 ≤ 7? 否 → temp[2] = 7, j++, k++ 左 [4, 8] 右 [5, 7] temp [4, 5, 7] ↑ ↑ i (j超出右边界) 步骤4: 右数组已空,将左数组剩余元素复制 temp[3] = 8 temp = [4, 5, 7, 8] 步骤5: 将temp复制回原数组 arr[left..right] 原数组对应位置变为 [4, 5, 7, 8]

代码关键点解析

代码段作用
int[] temp = new int[arr.length]只创建一次临时数组,避免递归中重复分配内存
mid = (left + right) / 2计算中点,将数组分成两半
sort(arr, left, mid, temp)递归排序左半部分
sort(arr, mid+1, right, temp)递归排序右半部分
while (i <= mid && j <= right)双指针比较,取较小者放入temp
while (i <= mid)/while (j <= right)处理剩余元素
arr[left + i] = temp[i]将排序好的temp复制回原数组

时间 & 空间复杂度

┌─────────────┬─────────────┐ │ 时间复杂度 │ O(n log n) │ ← 每层O(n),共log n层 ├─────────────┼─────────────┤ │ 空间复杂度 │ O(n) │ ← 临时数组temp ├─────────────┼─────────────┤ │ 稳定性 │ 稳定 │ ← arr[i] <= arr[j] 保证相等时先取左边 └─────────────┴─────────────┘

递归调用栈可视化

sort(0,7) ← 第1层调用 ├─ sort(0,3) ← 第2层 │ ├─ sort(0,1)← 第3层 │ │ ├─ sort(0,0) 返回 │ │ ├─ sort(1,1) 返回 │ │ └─ merge(0,0,1) → [4,8] │ ├─ sort(2,3) │ │ ├─ sort(2,2) 返回 │ │ ├─ sort(3,3) 返回 │ │ └─ merge(2,2,3) → [5,7] │ └─ merge(0,1,3) → [4,5,7,8] └─ sort(4,7) ← 类似右半部分...

核心要点:先递归到底(分解到单个元素),再逐层向上合并!

代码实现

publicclassMergeSort{// 归并排序入口publicstaticvoidmergeSort(int[]arr){int[]temp=newint[arr.length];sort(arr,0,arr.length-1,temp);}// 递归分解privatestaticvoidsort(int[]arr,intleft,intright,int[]temp){if(left<right){intmid=(left+right)/2;sort(arr,left,mid,temp);// 左半部分sort(arr,mid+1,right,temp);// 右半部分merge(arr,left,mid,right,temp);// 合并}}// 合并两个有序数组privatestaticvoidmerge(int[]arr,intleft,intmid,intright,int[]temp){inti=left;// 左序列指针intj=mid+1;// 右序列指针intk=0;// 临时数组指针// 比较并放入临时数组while(i<=mid&&j<=right){if(arr[i]<=arr[j]){temp[k++]=arr[i++];}else{temp[k++]=arr[j++];}}// 剩余元素处理while(i<=mid)temp[k++]=arr[i++];while(j<=right)temp[k++]=arr[j++];// 复制回原数组for(i=0;i<k;i++){arr[left+i]=temp[i];}}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/23 9:39:48

软件工程毕业设计必备:8款AI工具解决论文写作与代码难题

文章总结表格&#xff08;工具排名对比&#xff09; 工具名称 核心优势 aibiye 精准降AIGC率检测&#xff0c;适配知网/维普等平台 aicheck 专注文本AI痕迹识别&#xff0c;优化人类表达风格 askpaper 快速降AI痕迹&#xff0c;保留学术规范 秒篇 高效处理混AIGC内容&…

作者头像 李华
网站建设 2026/8/23 9:39:49

EtherCAT总线通信:基于STM32 MCU与AX58100 ESC从站实现方案揭秘

EtherCAT总线通信学习资料&#xff0c;一手资料。 提供基于stm32 mcu?AX58100 ESC实现从站的具体方案&#xff0c;有完整的工程文件&#xff0c;提供源码以及工程配置、程序修改的视频&#xff0c;工程在开发板上已测。 提供不同版本工具从站工程。 支持主站下发固件程序&…

作者头像 李华
网站建设 2026/8/23 9:39:49

大容量硬盘空间管理实战:用EternalBlaze硬链接技术优化TB级存储资源

在数据爆炸式增长的时代&#xff0c;个人用户拥有数TB存储空间已不罕见。 从4K视频素材到高分辨率照片&#xff0c;从虚拟机镜像到开发环境快照&#xff0c;大容量硬盘承载着日益庞大的数字资产。 然而&#xff0c;存储容量的扩张往往伴随着效率的下降——重复文件在庞大的数…

作者头像 李华
网站建设 2026/8/23 9:39:50

CentOS7下Zabbix5.0与MariaDB完美搭配:从零搭建到邮件告警全攻略

CentOS7下Zabbix5.0与MariaDB企业级监控系统实战指南 1. 环境准备与基础配置 在CentOS7系统上部署Zabbix5.0监控系统前&#xff0c;需要确保基础环境配置正确。以下是关键步骤和注意事项&#xff1a; 系统初始化配置&#xff1a; 更新系统软件包至最新版本&#xff1a;yum upda…

作者头像 李华
网站建设 2026/8/23 9:39:50

Linux 锁 (4) - seqlock

文章目录1. 前言2. seqlock 实现3. 小结4. 参考资料1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. seqlock 实现 seqlock 通过一个初始为 0 计数器&#xff0c;实现 writer 和 reader 共享数据…

作者头像 李华