排序算法-归并排序

news2024/11/20 18:23:42

属性

        归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使 子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 归并排序核心步骤:

        归并排序总结

        1. 归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。

        2. 时间复杂度:O(N*logN)

        3. 空间复杂度:O(N)

        4. 稳定性:稳定

代码及注释(递归实现)

    //mergeSort是归并排序提供使用的方法
    public static void mergeSort(int[]arr){
        //用mergeSortChild进行递归排序
        mergeSortChild(arr,0,arr.length-1);
    }

    private static void mergeSortChild(int[]arr,int left,int right){
        //出递归
        if(left>=right){
            return;
        }
        //先计算出要排序数据的中间位置
        int mid=(left+right)/2;
        //先分别归并排序左边和右边的数据,排序好以后再将左边和右边的数据合并
        mergeSortChild(arr,left,mid);
        mergeSortChild(arr,mid+1,right);
        merge(arr,left,right);
    }

    private static void merge(int[]arr,int left,int right){
        int mid=(left+right)/2;
        //left和right范围的数据分为了两个部分
        //用s1,e1表示第一部分的数据范围,s2,e2表示第二部分的数据范围
        //两个部分的数据分别是排序好了的,要将两个部分的数据进行合并
        int s1=left;
        int e1=mid;
        int s2=mid+1;
        int e2=right;

        //定义辅助数组help来帮助合并
        int[]help=new int[right-left+1];

        //放数据的时候有以下的几种情况
        //1.两个部分的数据还没有哪个部分全放到help数组中
        int k=0;    //k是用于指向help数组的下标
        while (s1<=e1&&s2<=e2){
            //当s1下标的数据比s2下标的小时,s1下标的数据就先放到help数组中
            if(arr[s1]<arr[s2]){
                help[k++]=arr[s1++];
            }
            else {
                help[k++]=arr[s2++];
            }
        }

        //2.s1>e1 第一部分的数据都放到了help数组中
        //直接将第二部分的数据全放到help数组中
        while (s2<=e2){
            help[k++]=arr[s2++];
        }

        //3.s2>e1 第二部分的数据都放到了help数组中
        //直接将第一部分的数据全放到help数组中
        while (s1<=e1){
            help[k++]=arr[s1++];
        }

        //此时两个部分的数据都放到了help数组中
        //将数组中对应部分的数据改为help数组中的数据(help数组中的数据是合并好了的)
        for(int i=left,j=0;i<=right;i++,j++){
            arr[i]=help[j];
        }

    }

代码及注释(非递归实现)
 

 //归并排序---非递归
    public static void mergeSortNo(int[] array){
        //一个数据为一组
        int gap=1;
        while (gap<array.length){
            for(int i=0;i<array.length;i+=2*gap){
                int left=i;
                int mid=left+gap-1;
                int right=mid+gap;

                merge(array,left,mid,right);
            }
            gap=gap*2;
        }
    } 

    //合并
    private static void merge(int[] array,int left,int mid,int right){
        int s1=left;
        int e1=mid;
        int s2=mid+1;
        int e2=right;

        //定义辅助数组
        int[]help=new int[right-left+1];
        int k=0;

        //两组数据都没放完
        while (s1<=e1&&s2<=e2){
            if(array[s1]<array[s2]){
                help[k++]=array[s1++];
            }
            else {
                help[k++]=array[s2++];
            }
        }

        //当有一组中的数据放完
        while (s1<=e1){
            help[k++]=array[s1++];
        }
        while (s2<=e2){
            help[k++]=array[s2++];
        }

        //将合并好的数据返回给数组array
        for (int i=0;i<help.length;i++){
            array[left+i]=help[i];
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1010905.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

k8s集群中部署服务之部署描述文件准备

微服务部署描述文件Deploy.yaml 一、各微服务创建部署描述文件 1.1 mall-auth-server --- apiVersion: apps/v1 kind: Deployment metadata:name: mall-auth-servernamespace: sangomalllabels:app: mall-auth-server spec:replicas: 1selector:matchLabels:app: mall-auth-s…

生产消费者模型的介绍以及其的模拟实现

目录 生产者消费者模型的概念 生产者消费者模型的特点 基于阻塞队列BlockingQueue的生产者消费者模型 对基于阻塞队列BlockingQueue的生产者消费者模型的模拟实现 ConProd.c文件的整体代码 BlockQueue.h文件的整体代码 对【基于阻塞队列BlockingQueue的生产者消费者模型…

css 清除浮动方案

清除浮动的三种方案 1. 第一种方案&#xff08;overflow: hidden&#xff09;2. 第二种方案&#xff08;clear&#xff1a;both&#xff09;3. 第三种方案&#xff08;为元素&#xff09; 1. 第一种方案&#xff08;overflow: hidden&#xff09; <style>.container {bac…

以AI对抗AI,大模型安全的“进化论”

点击关注 文丨刘雨琦&#xff0c;编&#xff5c;王一粟 “互联网时代&#xff0c;我们是更危险&#xff0c;还是更安全&#xff1f;” 2016年&#xff0c;互联网正值高速发展之际&#xff0c;电梯广告经常出现这几个大字&#xff0c;两行标语&#xff0c;从病毒木马到网络诈骗…

焕发生机|嵌入式存储eMMC原理解析

1.EMMC背景回顾 EMMC存储的发展历史可以追溯到1997年&#xff0c;当时该技术是为了解决移动设备中存储器的问题而提出的。当时移动设备的存储器主要是NOR flash&#xff0c;这种存储器虽然读写速度快&#xff0c;但是造价高、容量小&#xff0c;不适合大规模应用。而EMMC的出现…

JWT安全及案例实战

文章目录 JWT 安全1. Cookie2. Session3. Token4. JWT4.1 JWT概述4.1.1 JWT头4.1.2 有效载荷4.1.3 签名哈希4.1.4 通信流程 4.2 JWT 漏洞描述4.3 JWT 漏洞原理4.4 JWT 安全防御 5. WebGoat 靶场实验5.1 第四关5.2 第五关5.3 第七关 越权与逻辑漏洞 Web漏洞点只有一个入口&#…

Vue开发小注意点

改bug 更改了配置项啥的&#xff0c;保存刷新发现没变&#xff0c;那就重启项目&#xff01;&#xff01;&#xff01;&#xff01; binding.value 和 e.target.value binding.value Day5 指令的值 e.target.value Day4 表单组件封装 binding.value 和 e.target.valu…

hiredis在vs2010上编译不通过

下载源代码 https://github.com/redis/hiredis 然后单独创建pro文件&#xff0c;将相应的.c和.h文件加进去。 然后使用vs2010&#xff08;带有qt插件&#xff09;打开.pro文件&#xff0c;编译报错 上面的为C99语法&#xff0c;而vs2010不支持。只能选择 https://github.com/…

API原理概念篇(六)玩转正则表达式等常用API

一 玩转正则表达式等常用API ① 正则 1、openresty存在两套正则表达式规范1) lua自身独有的正则规范 备注&#xff1a;大约有5%&#xff5e;15%性能损耗损耗原因&#xff1a;表达式compile成pattern,并不会被缓存,每次都会被重新compile编译2) nginx的符合POSIX规范的PCR…

[Hadoop] start-dfs.sh ssh报错

Permission denied (publickey 决解方案 相关命令 cd ~/.sshssh-keygen -t rsa -p""cat id_rsa.pub >> authorized_keyschmod 0600 authorized_keys 相关链接Hadoop: start-dfs.sh permission denied - Stack Overflow Java HotSpot(TM) Server VM warning…

分享!JetBrains IDE中的GitLab支持

GitLab是流行的基于git的软件开发和部署平台之一&#xff0c;虽然很长一段时间以来&#xff0c;所有基本git操作都已经可以通过GitLab实现&#xff0c;但GitLab集成仍是JetBrains社区的一大最热门请求。为此&#xff0c;JetBrains团队今年与GitLab联手提供了这种类型的集成。 …

【问题记录】解决Git上传文件到GitHub时收到 “GH001: Large files detected” 错误信息!

环境 Windows 11 家庭中文版git version 2.41.0.windows.1GitHub 问题情况 在命令行中使用git上传pdf文件到GitHub服务器时&#xff0c;提示了如下警告信息&#xff1a; 原因是 GitHub 有一个文件大小限制&#xff0c;通常为 100 MB。 如果尝试上传大于此限制的文件&#xff0c…

EMANE中olsrd的调试

1 调试目的 本着学习的态度&#xff0c;对emane tutorial中的示例程序进行重现&#xff0c;以加深对EMANE的理解和掌握。在示例程序0(见https://github.com/adjacentlink/emane-tutorial/wiki/Demonstration-0)中介绍了使用olsrlinkview.py脚本来通过可视化界面观察olsr节点的链…

Marin说PCB之封装设计系列---(01)--非金属化孔的设计总结

提到封装设计小编我刚刚开始学习的时候也是一头雾水&#xff0c;在网上各种找视频学习怎么建封装。在这里小编我也推荐一波凡亿PCB商城上是有封装课程的&#xff0c;我当时就是买的凡亿的封装设计课程自己跟着老师学习的&#xff0c;效果还是挺好的。小编我免费给他们做一波推广…

集合减法【新思路】

#include<stdio.h> int main() {int n,m,flag0;int x;int a[100001]{0},b[100001]{0};scanf("%d %d",&n,&m);以集合A所有元素作为数组下标映射值成1 for (int i 0; i < n; i) {scanf("%d", &x);a[x] 1; }以集合B所有元素作为数组下…

Fuxploider:一款针对文件上传漏洞的安全检测与研究工具

Fuxploider:一款针对文件上传漏洞的安全检测与研究工具 1.概述2. 工具使用1.概述 Fuxploider是一款功能强大的开源渗透测试工具,该工具专门针对文件上传漏洞而设计,可以帮助广大研究人员以自动化的方式检测和利用目标站点文件上传表单中的安全问题 由于该工具基于Python 3…

用ChatGPT自动生成流程图

我们看别人代码时&#xff0c;总希望有流程图&#xff0c;这样可以一目了然&#xff0c;不过自己写的代码&#xff0c;又不想花几个小时去画流程图。有没有更好的方法呢&#xff1f; 方法就是用ChatGPT等大模型自动生成流程图&#xff0c;并用python等语言实现自动输出流程图。…

第13篇:ESP32 idf wifi联网使用SNTP同步网络时间LCD ST7920液晶屏显示

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 第4篇:vscodeplatformio搭建esp32 arduino开发环境 ​​​​​​第5篇:doit_esp32_devkit_v1使用pmw呼吸灯实验 第6篇:ESP32连接无源喇叭播…

什么是Jmeter?Jmeter使用的原理步骤是什么?

1.1 什么是 JMeter Apache JMeter 是 Apache 组织开发的基于 Java 的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于 Web 应用测试&#xff0c;但后来扩展到其他测试领域。 它可以用于测试静态和动态资源&#xff0c;例如静态文件、Java 小服务程序、CGI 脚…

贝叶斯分位数回归、lasso和自适应lasso贝叶斯分位数回归分析免疫球蛋白、前列腺癌数据...

原文链接&#xff1a;http://tecdat.cn/?p22702 贝叶斯回归分位数在最近的文献中受到广泛关注&#xff0c;本文实现了贝叶斯系数估计和回归分位数&#xff08;RQ&#xff09;中的变量选择&#xff0c;带有lasso和自适应lasso惩罚的贝叶斯&#xff08;点击文末“阅读原文”获取…