归并排序

归并排序

-归并排序的特点

  1. 具有稳定性
  2. 时间复杂度 ( O(N log(N)) )
  3. 空间复杂度 ( O(N) )

-归并排序的原理

此处以升序为例
在这里插入图片描述

-归并排序的代码

public static void mergeSort(int[] arr){
        mergeSort2(arr, 0, arr.length);
    }

    private static void mergeSort2(int[] arr, int left, int right) {
        if(right - left <= 1){
            return;
        }
        int mid = (right + left) / 2;
        //先把左右区间都变成有序区间
        mergeSort2(arr, left, mid);
        mergeSort2(arr, mid, right);
        //然后开始合并
        mergr(arr, left, mid, right);
    }

    private static void mergr(int[] arr, int left, int mid, int right) {
        if(left >= right){
            return;
        }
        //需要创建一个临时数组用来辅助合并
        int[] tem = new int[right-left];
        int temindex = 0;
        int cur1 = left;
        int cur2 = mid;
        while(cur1 < mid && cur2 < right){
            if(arr[cur1] <= arr[cur2]){
                //归并排序稳定的主要原因就是这里写的是 <=
               tem[temindex] = arr[cur1];
               temindex++;
               cur1++;
            }else{
                tem[temindex] = arr[cur2];
                temindex++;
                cur2++;
            }
        }
        //循环结束后一方一定为空, 这时候我们需要把另一方全部移接到tem数组中
        while(cur1 < mid){
            tem[temindex] = arr[cur1];
            temindex++;
            cur1++;
        }
        while(cur2 < right){
            tem[temindex] = arr[cur2];
            temindex++;
            cur2++;
        }
        //最后需要把tem数组中的元素全部移回原来的数组中
        for(int i = 0; i < tem.length; i++){
            arr[left + i] = tem[i];
        }
    }

-归并排序的非递归写法

private static void mergeSortNoR(int[] arr) {
        //设置gap作为每个组内的长度
        //初始情况每个组内只有一个元素
        //gap从1开始, 第二次为2, 第三次为4
        int gap = 1;
        for(; gap < arr.length; gap = gap * 2){
            //内层循环开始遍历数组以gap为间隔开始合并
            for(int cur = 0; cur < arr.length; cur = cur + 2 * gap){
                //要把[left, mid)和[mid, right)进行合并
                int left = cur;
                int mid = cur + gap;
                if(mid >= arr.length){
                    mid = arr.length;
                }
                int right = cur + gap * 2;
                if(right >= arr.length){
                    right = arr.length;
                }
                mergr(arr, left, mid, right);
            }
        }
    }

private static void mergr(int[] arr, int left, int mid, int right) {
        if(left >= right){
            return;
        }
        //需要创建一个临时数组用来辅助合并
        int[] tem = new int[right-left];
        int temindex = 0;
        int cur1 = left;
        int cur2 = mid;
        while(cur1 < mid && cur2 < right){
            if(arr[cur1] <= arr[cur2]){
                //归并排序稳定的主要原因就是这里写的是 <=
               tem[temindex] = arr[cur1];
               temindex++;
               cur1++;
            }else{
                tem[temindex] = arr[cur2];
                temindex++;
                cur2++;
            }
        }
        //循环结束后一方一定为空, 这时候我们需要把另一方全部移接到tem数组中
        while(cur1 < mid){
            tem[temindex] = arr[cur1];
            temindex++;
            cur1++;
        }
        while(cur2 < right){
            tem[temindex] = arr[cur2];
            temindex++;
            cur2++;
        }
        //最后需要把tem数组中的元素全部移回原来的数组中
        for(int i = 0; i < tem.length; i++){
            arr[left + i] = tem[i];
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值