排序算法-归并排序

归并:将原始数组划分为若干个子数组,然后将这些子数组分别排序,最后再将已排序的子数组合并成一个有序的数组。是一种分治思想

思路:

1.分

2.治

3.怎么治

将两个已经有序的子序列合并成一个有序序列,比如最后一次合并要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8]

3.1定义一个help数组,定义两个指针p1和p2,p1指向第一个数组的第一个位置,p2指向第二个数组的第二个位置

3.2 从头开始判断两个数组中的数谁大谁小,小的放入help数组中,指针向后移动,直到有一个数组的所有数都放入了help数组中,然后直接把另一个数组的剩下数放入到help数组中去。最终help数组为两个已经有序的子序列合并的那一个有序序列

java 复制代码
class Solution {
    public int[] sortArray(int[] nums) {
        process(nums,0,nums.length-1);
        return nums;
    }

    public void process(int[] nums ,int l,int r){
        if(l==r){
            return;
        }

        int midIndex=l+((r-l)>>1);
        process(nums,l,midIndex);
        process(nums,midIndex+1,r);
        //将两个已经有序的子序列合并成一个有序序列
        merge(nums,l,midIndex,r);
    }

    public void merge(int[] nums,int l,int midIndex,int r){
        int[] help=new int[r-l+1];
        int i=0;
        int p1=l;
        int p2=midIndex+1;
        while(p1<=midIndex && p2<=r){
            help[i++]=nums[p1]<=nums[p2] ? nums[p1++] :nums[p2++];
        }
        while(p1<=midIndex){
            help[i++]=nums[p1++];
        }
        while(p2<=r){
            help[i++]=nums[p2++];
        }

        for(int j=0;j<help.length;j++){
            nums[l+j]=help[j];
        }
    }
}
相关推荐
花火|4 分钟前
算法训练营day62 图论⑪ Floyd 算法精讲、A star算法、最短路算法总结篇
算法·图论
GuGu202412 分钟前
新手刷题对内存结构与形象理解的冲突困惑
算法
ZZHow102413 分钟前
Java项目-苍穹外卖_Day2
java·spring boot·web
汤永红14 分钟前
week4-[二维数组]平面上的点
c++·算法·平面·信睡奥赛
float_六七17 分钟前
Spring Boot 3为何强制要求Java 17?
java·spring boot·后端
叫我阿柒啊30 分钟前
从Java全栈到前端框架的深度探索
java·微服务·typescript·vue3·springboot·前端开发·全栈开发
晴空闲雲30 分钟前
数据结构与算法-字符串、数组和广义表(String Array List)
数据结构·算法
架构师沉默1 小时前
Java 开发者别忽略 return!这 11 种写法你写对了吗?
java·后端·架构
RainbowJie11 小时前
Gemini CLI 与 MCP 服务器:释放本地工具的强大潜力
java·服务器·spring boot·后端·python·单元测试·maven
毕设源码尹学长2 小时前
计算机毕业设计 java 血液中心服务系统 基于 Java 的血液管理平台Java 开发的血液服务系统
java·开发语言·课程设计