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

归并排序 Java 实现 + 思路详解

一、核心思想(分治算法)

归并排序两大阶段:分 + 治

  1. 分(分割):不断把当前数组对半拆分成左右两个子数组,直到每个子数组只有1 个元素(单个元素天然有序)。
  2. 治(合并):将两个已经有序的子数组,合并成一个有序数组;不断向上合并,最终整个数组有序。

算法特性(面试重点)

  • 时间复杂度:稳定 O (nlogn),最好、最坏、平均都一样,不受原始数组顺序影响
  • 空间复杂度:O(n),需要额外辅助数组
  • 稳定排序
  • 缺点:需要开辟额外内存,不适合超大数量级内存紧张场景

二、完整代码实现

java

运行

public class MergeSort { public static void main(String[] args) { int[] arr = {8, 4, 5, 7, 1, 3, 6, 2}; System.out.println("排序前:"); printArr(arr); // 创建临时数组,避免递归反复创建,优化性能 int[] temp = new int[arr.length]; mergeSort(arr, 0, arr.length - 1, temp); System.out.println("排序后:"); printArr(arr); } /** * 递归分割数组 * @param arr 原始数组 * @param left 当前区间左边界 * @param right 当前区间右边界 * @param temp 合并使用的临时数组 */ public static void mergeSort(int[] arr, int left, int right, int[] temp) { // 递归终止条件:区间只有一个元素 if (left >= right) { return; } // 中间分割点 int mid = left + (right - left) / 2; // 递归拆分左区间 [left, mid] mergeSort(arr, left, mid, temp); // 递归拆分右区间 [mid+1, right] mergeSort(arr, mid + 1, right, temp); // 左右两个子区间都有序后,进行合并 merge(arr, left, mid, right, temp); } /** * 合并两个有序区间:[left,mid] 和 [mid+1,right] */ public static void merge(int[] arr, int left, int mid, int right, int[] temp) { int i = left; // 左有序数组起始指针 int j = mid + 1; // 右有序数组起始指针 int t = 0; // temp数组指针 // 依次比较左右两个有序数组,小的放入临时数组 while (i <= mid && j <= right) { if (arr[i] <= arr[j]) { temp[t++] = arr[i++]; } else { temp[t++] = arr[j++]; } } // 左边剩余元素移入temp while (i <= mid) { temp[t++] = arr[i++]; } // 右边剩余元素移入temp while (j <= right) { temp[t++] = arr[j++]; } // 将temp中有序数据拷贝回原数组对应区间 t = 0; while (left <= right) { arr[left++] = temp[t++]; } } // 打印数组 public static void printArr(int[] arr) { for (int num : arr) { System.out.print(num + " "); } System.out.println(); } }

三、流程简单推演

数组[8,4,5,7,1,3,6,2]

  1. 不断对半拆分:[8,4,5,7][1,3,6,2]继续拆分直到单元:[8] [4] [5] [7] [1] [3] [6] [2]

  2. 两两合并:[8]+[4][4,8][5]+[7][5,7][1]+[3][1,3][6]+[2][2,6]

  3. 继续向上合并:[4,8] + [5,7][4,5,7,8][1,3] + [2,6][1,2,3,6]

  4. 最终合并两大块:[4,5,7,8] + [1,2,3,6][1,2,3,4,5,6,7,8]

四、面试对比小结

  1. 快排:不稳定,原地排序(少量额外空间),平均性能最好;最坏 O (n²)
  2. 归并排序:稳定,必须 O (n) 辅助空间;复杂度稳定 O (nlogn)
  3. 堆排序:不稳定,O (1) 额外空间,O (nlogn)

拓展:Java 底层Arrays.sort()基础类型使用双轴快排; 引用类型使用归并排序(保证稳定)。

http://www.jsqmd.com/news/1247922/

相关文章:

  • 日报周报写到吐,同事用 GPTs 十分钟收工
  • 2026年7月最新真力时泰州泰兴吾悦广场维修保养服务电话 - 亨得利钟表维修中心
  • Ubuntu 24.04安装ROS2 Humble完整指南与避坑技巧
  • 南京劳力士售后服务门店|全新维修地址及客服电话权威公示(2026年7月最新) - 劳力士售后服务官网
  • 东芝空调TOSHIBA推出全国统一24小时售后服务电话人工上线2026最新公布 - 优企名品
  • 介绍一下分库分表
  • 2026年AI学术写作工具评测与选择指南
  • 中小企业网盘怎么选?2026高性价比企业同步盘方案对比
  • OMEGA 维修点全国地址查询,2026 年 7 月,欧米茄售后维修点大全 - 欧米茄维修服务中心
  • C++实现高斯噪声生成器:从Box-Muller变换到图像处理实战
  • 无需长时热处理!ACS Applied Energy Materials:0.5 秒焦耳热让碳纤维/MnOx 电极快速成型
  • Unity换装系统骨骼绑定避坑指南:5大常见错误与修复方案
  • AI应用落地四大核心要素:LLM、Agent、MCP与Skill实践
  • 房地产电子沙盘能提高多少转化率?
  • 宝玑2026年7月最新公布:客服服务热线及全国网点地址一览 - 亨得利官方服务中心
  • 2026 推荐肇庆非急救长途转运|正规救护车跨省护送服务 - 官方推广
  • 产品经理对接API的四大挑战与解决方案
  • 2026年模组PACK智能生产线制造商推荐榜:高性价比选型指南 - 资讯在线
  • 2026贵阳暑期黄金回收避坑指南:杜绝遥控秤,认准本地连锁老店 - 奢侈品回收知识分享
  • AI降重工具实测:自考论文写作的查重困境与解决方案
  • 2026 年长治名表回收市场规范发展 恒益奢品汇连锁服务信息公示 - GrowUME
  • eUSB2中继器设计实战:从电气规范到PCB布线的完整指南
  • 长虹空调推出全国统一24小时售后服务电话人工上线2026最新公布 - 优企名品
  • 维修服务地址劳力士表专业维修保养服务中心权威公示(2026年7月最新) - 劳力士服务中心
  • 034、YOLOv8改进实战:MHSA多头自注意力机制原理与C2f_MHSA模块代码实现
  • 2026滨州黄金回收避坑指南:万金汇直营门店更靠谱 - 观金堂黄金回收
  • 讲笔实用指南录屏・画中画・字幕
  • 成都亨得利售后保养电话 维修服务中心权威公示(2026年7月最新) - 亨得利官方博客
  • 自动化仓储物流管理系统有哪些 各系统功能与协同方案
  • 接纳孩子不同交友方式,适度引导守住相处底线即可