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

归并排序算法

归并排序

所用方法和基本原理

归并排序是一种基于分治思想的排序算法。其基本原理如下:

  1. 分解:将一个长度为 (n) 的数组不断地二分,直到每个子数组只包含一个元素(因为单个元素的数组天然是有序的)。例如,对于长度为 (n) 的数组,先找到中间位置 (mid),将数组分为左半部分 ([l, mid]) 和右半部分 ([mid + 1, r])。
  2. 解决:递归地对左右两个子数组进行归并排序,使得左右子数组各自有序。
  3. 合并:将两个已经有序的子数组合并成一个有序的数组。通过比较两个子数组的当前元素,将较小的元素依次放入一个临时数组,最后将临时数组的内容复制回原数组对应的位置。

代码及注释

public class MergeSort {// 归并排序主函数,对数组arr的[l, r]区间进行排序public static void mergeSort(int[] arr, int l, int r) {// 如果l等于r,说明只有一个元素,已经有序,直接返回if (l == r) return;// 计算中间位置midint mid = l + (r - l >> 1);// 递归对左半部分数组进行归并排序mergeSort(arr, l, mid);// 递归对右半部分数组进行归并排序mergeSort(arr, mid + 1, r);// 计算当前需要合并的数组长度int len = r - l + 1;// 创建一个临时数组temp,用于存储合并过程中的数据int[] temp = new int[len];// 左半部分数组的起始索引int i = l;// 右半部分数组的起始索引int j = mid + 1;// 临时数组的索引int k = 0;// 比较左右两个子数组的元素,将较小的元素放入临时数组while (i <= mid && j <= r) {if (arr[i] <= arr[j]) {temp[k++] = arr[i++];} else {temp[k++] = arr[j++];}}// 将左半部分数组剩余的元素放入临时数组while (i <= mid) {temp[k++] = arr[i++];}// 将右半部分数组剩余的元素放入临时数组while (j <= r) {temp[k++] = arr[j++];}// 将临时数组中的元素复制回原数组对应的位置for (int t = 0; t < len; t++) {arr[l + t] = temp[t];}}
}

举例说明

假设有数组 arr = [38, 27, 43, 3, 9, 82, 10]

  1. 分解阶段
    • 初始数组长度为 7,l = 0r = 6,计算 mid = 0 + (6 - 0 >> 1) = 3
    • 递归对左半部分 [38, 27, 43, 3] 进行排序,再次二分,mid = 0 + (3 - 0 >> 1) = 1,继续递归直到每个子数组只有一个元素。
    • 同样对右半部分 [9, 82, 10] 进行类似的二分操作。
  2. 合并阶段
    • 以最底层的合并为例,假设要合并 [3][27],比较 327,将 3 放入临时数组,再将 27 放入,得到 [3, 27]
    • 继续合并,比如将 [3, 27][38, 43] 合并。i 指向 3j 指向 38,比较 338,将 3 放入临时数组,i 后移,比较 2738,将 27 放入,以此类推,最终得到 [3, 27, 38, 43]
    • 对右半部分也进行类似合并,最后将左右两个有序的子数组合并,得到整个有序的数组 [3, 9, 10, 27, 38, 43, 82]

方法的优劣

  1. 时间复杂度
    • 归并排序的时间复杂度在最好、最坏和平均情况下均为 (O(n \log n))。这是因为每次分解都将数组分成两部分,共需要 (\log n) 层递归,而每层递归中合并操作的时间复杂度为 (O(n)),所以总的时间复杂度为 (O(n \log n))。
  2. 空间复杂度
    • 空间复杂度为 (O(n)),主要是因为在合并过程中需要一个与原数组长度相同的临时数组来存储合并的结果。

优点:

  • 时间复杂度稳定为 (O(n \log n)),适用于对稳定性有要求的排序场景,因为归并排序是稳定排序算法,即相等元素的相对顺序在排序前后保持不变。
    缺点:
  • 空间复杂度较高,需要额外的 (O(n)) 空间用于临时数组。在处理大规模数据且内存紧张的情况下可能不太适用。
http://www.lqws.cn/news/518023.html

相关文章:

  • 企业内部安全组网技术解析:安全通道选型、零信任架构与数据合规加密防护
  • 计算机网络-----详解HTTP协议
  • 基于springboot+vue的智慧农业专家远程指导系统
  • 苹果签名应用掉签频繁原因排查,以及如何避免
  • Mysql使用窗口函数查询
  • 左神算法之有序二维矩阵中的目标值查找
  • vscode管理go多个版本
  • 英飞凌高性能BMS解决方案助力汽车电动化
  • 【世纪龙科技】新能源汽车VR虚拟体验展示馆-解锁认知新维度
  • 灰度发布怎么保证数据库一致的
  • AES加密:为你的PDF文档加上一道钢铁防线
  • Kubernetes、Docker Swarm 与 Nomad 容器编排方案深度对比与选型指导
  • 论文阅读:A Survey on Large Language Models for Code Generation
  • 不用vue,只用html,即可简单实现electron项目
  • 鸿蒙OpenHarmony[Disassembler反汇编工具]ArkTS运编译工具链
  • IntelliJ IDEA 社区版安装终极教程(2025 最新图文详解)
  • 微信小程序中scss、ts、wxml
  • React19源码系列之 API (react)
  • 惠普HP Laser MFP 116w 打印机信息
  • 深度解析Lucene IndexWriter 性能优化
  • 银河麒麟高级服务器操作系统(全架构)OpenGauss 数据库部署手册
  • Fisco Bcos学习 - 控制台搭建和基本使用
  • SpringBoot中5种拦截器使用场景
  • Odoo OWL 前端开发:ORM 与 RPC 服务的选择
  • HarmonyOS 5分布式数据库有哪些性能指标?
  • GPT-5企业级应用落地指南:70个工业场景实战部署全景(2025)
  • 贪心算法理论与实践总结
  • 《中国电信运营商骨干网:历史、现状与未来演进》系列 第五篇:新玩家入局——中国广电CBNNET如何构建全国一张网?
  • 鸿蒙系统(HarmonyOS)经典红色风格登录页布局
  • MySQL之视图深度解析