排序算法-归并排序

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

核心思想

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

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

合并的过程

代码实现

java 复制代码
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) 临时数组的空间占用主导(通常说的空间复杂度指除输入外的额外空间需求)
相关推荐
Re_zero2 小时前
线上日志被清空?这段仅10行的 IO 代码里竟然藏着3个毒瘤
java·后端
洋洋技术笔记2 小时前
Spring Boot条件注解详解
java·spring boot
程序员清风20 小时前
程序员兼职必看:靠谱软件外包平台挑选指南与避坑清单!
java·后端·面试
皮皮林55121 小时前
利用闲置 Mac 从零部署 OpenClaw 教程 !
java
是希燃亚1 天前
📚 十大经典排序算法 C语言笔记(一看就会版)
排序算法
华仔啊1 天前
挖到了 1 个 Java 小特性:var,用完就回不去了
java·后端
SimonKing1 天前
SpringBoot整合秘笈:让Mybatis用上Calcite,实现统一SQL查询
java·后端·程序员
日月云棠2 天前
各版本JDK对比:JDK 25 特性详解
java
用户8307196840822 天前
Spring Boot 项目中日期处理的最佳实践
java·spring boot
JavaGuide2 天前
Claude Opus 4.6 真的用不起了!我换成了国产 M2.5,实测真香!!
java·spring·ai·claude code