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

排序算法-归并排序

归并排序是一种分治算法(Divide and Conquer)。对于给定的一组数据,利用递归与分治技术将数据序列划分成为越来越小的半子表,在对半子表排序后,再用递归方法将排好序的半子表合并成为越来越大的有序序列。

核心思想

  1. 分解(Divide):将数组递归地分成两半,直到子数组长度为 1。

  2. 合并(Merge):将两个已排序的子数组合并成一个有序数组。

合并的过程

 代码实现

package Sort;import java.util.Arrays;public class MergeSort {public static void main(String[] args) {int[] res = getMergeSort(new int[]{8,5,7,9,1,6,3,4,2});for (int i = 0; i < res.length; i++) {System.out.print(res[i]+" ");}}//使用递归实现归并排序,升序public static int[] getMergeSort(int[] nums){if (nums.length<2) return nums;//切分数组,然后递归排序,并用merge合并int mid = nums.length/2;int[] leftNums = Arrays.copyOfRange(nums,0,mid);int[] rightNums = Arrays.copyOfRange(nums,mid,nums.length);return merge(getMergeSort(leftNums),getMergeSort(rightNums));}public static int[] merge(int[] leftNums,int[] rightNums){int[] result = new int[leftNums.length + rightNums.length];for (int index = 0, i = 0, j = 0; index < result.length ; index ++) {if (i>=leftNums.length){// 左边数组已经取完,那就完全取右边数组即可result[index] = rightNums[j++];} else if (j>=rightNums.length) { // 右边数组已经取完,那就完全取左边即可result[index] = leftNums[i++];} else if (rightNums[j] < leftNums[i]) { // 升序:右边数组的元素小于左边数组,取右边数组的值result[index] = rightNums[j++];}else { // 升序:左边数组的元素小于右边数组,取左边数组的值result[index] = leftNums[i++];}}return result;}}

时间复杂度分析

情况时间复杂度说明
最坏情况O(n log n)无论输入数据如何分布,都必须完整执行所有分解和合并操作
最好情况O(n log n)即使输入已经有序,仍需进行全部合并操作
平均情况O(n log n)算法性能稳定,不受输入数据分布影响

空间复杂度分析

组成部分空间消耗说明
临时数组O(n)合并操作需要与原始数组等大的临时存储空间
递归调用栈O(log n)递归深度为 log₂n,每层递归需要保存常数级的参数
总空间O(n)临时数组的空间占用主导(通常说的空间复杂度指除输入外的额外空间需求)
http://www.xdnf.cn/news/352351.html

相关文章:

  • 在线caj转换word
  • 安全核查基线-2.nfslock服务
  • 密码学--AES
  • 解密火星文:LeetCode 269 题详解与 Swift 实现
  • Uskin阵列式三轴力触觉传感器:驱动机器人智能的触觉数据专家
  • 达梦、PostgreSQL数据库讲json解析成临时表(json_table函数的使用)
  • HunyuanCustom, 腾讯混元开源的多模态定制视频生成框架
  • PostgreSQL 的 pg_advisory_lock 函数
  • 输入顶点坐标输出立方体长宽高的神经网络
  • Microsoft Azure DevOps针对Angular项目创建build版本的yaml
  • 【MySQL】存储引擎 - ARCHIVE、BLACKHOLE、MERGE详解
  • 电机密集型工厂环境下的无线通信技术选型与优化策略
  • Azure资源创建与部署指南
  • 嵌入式培训之C语言学习完(十七)结构体、共用体、枚举、typedef关键字与位运算
  • 嵌入式openharmony标准系统中GPIO口控制详解
  • rust-candle学习笔记11-实现一个简单的自注意力
  • 前端工程化和性能优化问题详解
  • Vue3 中 ref 与 reactive 的区别及底层原理详解
  • fakebook
  • 【Linux】深入拆解Ext文件系统:从磁盘物理结构到Linux文件管理
  • 在企业级项目中高效使用 Maven-mvnd
  • 2025-05-10-FFmepg库裁切有水印的视频
  • docker 日志暴露方案 (带权限 还 免费 版本)
  • 企业如何将钉钉付款单高效集成到金蝶云星空?
  • 高频微服务面试题总结
  • 【MySQL】联合查询
  • 自适应混合索引创建与管理:一种智能数据库优化机制的研究
  • 高并发内存池(二):项目的整体框架以及Thread_Cache的结构设计
  • 怎么用idea打jar包
  • 从“山谷论坛”看AI七剑下天山