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

排序(4)-归并排序专题——归并排序的分治美学

📌 引言

如果说快速排序是一位大开大合的“开拓者”,那归并排序(Merge Sort)就是一位步步为营的“哲学家”。它完美践行了计算机科学中最核心的分治思想(Divide and Conquer)。同时,它因为极其优秀的稳定性,成为了许多语言(包括 Java)实现工业级排序算法的绝对基石。

1. 归并排序(Merge Sort)

💡 核心思想

归并排序的核心可以用八个字概括:先分后治,合二为一

  • 分(Divide):找到数组的中点,将其一分为二。递归地对左半部分和右半部分继续切分,直到子数组的长度为 1(长度为 1 的数组天然有序)。

  • 治/合(Merge):将两个已经有序的子数组合并成一个更大的、完全有序的数组。在这个过程中需要一个辅助数组来暂存数据。

💻 Java 代码实现(高性能标准版)
public class MergeSort { public static void sort(int[] arr) { if (arr == null || arr.length < 2) return; // 关键优化:预先分配好辅助空间,避免在递归方法中频繁 new 数组导致内存碎片 int[] aux = new int[arr.length]; sort(arr, 0, arr.length - 1, aux); } private static void sort(int[] arr, int left, int right, int[] aux) { if (left >= right) return; // 递归基:子数组长度为 1 int mid = left + (right - left) / 2; // 防溢出的中点写法 sort(arr, left, mid, aux); // 递归使左半部分有序 sort(arr, mid + 1, right, aux); // 递归使右半部分有序 // 优化:如果左边的最大值已经小于等于右边的最小值,说明已经整体有序,无需 merge if (arr[mid] > arr[mid + 1]) { merge(arr, left, mid, right, aux); // 核心合并操作 } } private static void merge(int[] arr, int left, int mid, int right, int[] aux) { // 1. 将当前区间的元素复制到辅助数组 for (int k = left; k <= right; k++) { aux[k] = arr[k]; } // 2. 双指针合并 int i = left; // 左半部分指针 int j = mid + 1; // 右半部分指针 for (int k = left; k <= right; k++) { if (i > mid) { arr[k] = aux[j++]; // 左半边已用尽,直接取右半边 } else if (j > right) { arr[k] = aux[i++]; // 右半边已用尽,直接取左半边 } else if (aux[i] <= aux[j]) { arr[k] = aux[i++]; // 左边小或相等,取左边(这里的 <= 保证了算法的稳定性) } else { arr[k] = aux[j++]; // 右边小,取右边 } } } }
📊 性能分析
  • 时间复杂度:无论数组初始状态如何,归并排序的递归树层数都是 \log n,每层合并的开销都是 O(n)。因此,它的最好、最坏、平均时间复杂度全都是严格的O(n \log n)

  • 空间复杂度:O(n)。由于在合并阶段需要和原数组等长的辅助数组来暂存元素,这是它相比于快排和堆排序最大的劣势(空间换时间)。

  • 稳定性:稳定。只要在merge逻辑中,当左右指针元素相等时优先采用左侧元素(aux[i] <= aux[j]),就能完美保持相同元素的相对顺序。

http://www.rkmt.cn/news/1509809.html

相关文章:

  • 武汉复读机构推荐武汉襄五学校 - 善良的阿良
  • 别再死记命令了!用Wireshark抓包带你彻底搞懂华三GRE隧道封装原理
  • STM32项目里直接用的ESP8266串口驱动,AP和STA模式都已封装好
  • AI泡沫下的真实生产力:万亿美元热浪与落地断层
  • vLLM 云原生推理基础设施深度解析:从 PagedAttention 内核到 Kubernetes 生产级部署
  • 当Kabeja遇见Spring Boot:为老旧DXF解析库注入现代生命力
  • 2025-2026年PVC卡片打印机厂商盘点 多场景适配 - 资讯快报
  • 2026最新太原市黄金回收价格一览表回收避坑攻略及靠谱商家推荐 - 润富黄金回收
  • 2026 新余卫生间漏水不用砸砖?微创补漏靠谱方案 - 苏易修缮
  • 2026年河北玻璃钢环保设备采购指南:从电缆桥架到一体化泵站的专业选型方案 - 优质企业观察收录
  • 2026年深圳知识产权诉讼律师推荐:专业实力护航硬科技创新 - 本地品牌推荐
  • 5分钟快速上手:PotPlayer百度翻译插件完整配置指南
  • 武汉高三复读学校怎么选,哪个学校比较好?联系电话 - 善良的阿良
  • 2026曲靖市黄金回收价格一览表回收避坑攻略靠谱商家推荐 - 润富黄金回收
  • 2026 茂名卫生间漏水不用砸砖?微创补漏靠谱方案 - 苏易修缮
  • 想二次开发Kettle?先搞懂它的源码结构:以9.2.0.0-R版本为例,拆解kettle-core、engine、plugins等核心模块
  • 武汉科谷技工学校2026年简介-学校详细地址 - 善良的阿良
  • 别再乱调了!深入浅出聊聊无人机电调的那些‘隐藏’设置:从油门行程到PWM精度
  • 从服务能力看贵州搬家公司市场格局:一次涵盖居民搬家与企业搬家的综合梳理 - 深度智识库
  • S32K3xx手册太厚读不完?我用这篇笔记帮你划好安全与低功耗的重点
  • X-AnyLabeling一键可用的YOLOX-s轻量ONNX自动标注方案
  • i.MX6ULL平台libmodbus 3.1.6交叉编译实操资源包(含补丁说明与完整构建脚本)
  • Mythos:面向可验证叙事的AI世界状态建模技术
  • 告别“黑边”困扰!动态调整滤波窗口的EIS防抖策略详解与效果对比
  • Mythos状态化推理引擎:解锁多步逻辑与跨文档一致性
  • # 2026年国内绿化公司实力排行榜:长三角等地口碑优质,基于绿化行业市场的5大权威推荐榜单 - 十大品牌榜
  • HoRain云--Rust 面向对象
  • Spring Cloud Gateway 的 SpEL 表达式注入漏洞(CVE-2022-22947)
  • 2026年安徽合肥理工学校寿春实验班怎么样?在哪报名?官网最新发布 - 小张zc
  • 拆解一个充电宝,聊聊DW01-A这颗‘电池保姆’芯片是如何工作的