排序(六):归并排序

2023-11-13

排序算法系列文章

排序(一):冒泡排序
排序(二):选择排序
排序(三):堆排序
排序(四):插入排序
排序(五):二分搜索
排序(六):归并排序
排序(七):快速排序
排序(八):希尔排序

归并排序(Merge-Sort)

基本思想

  • 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,与快速排序一样,归并排序也是基于分治法的(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。
  • 归并排序将待排序的元素序列分成两个长度相等的子序列,为每一个子序列排序,然后再将他们合并成一个子序列。合并两个子序列的过程也就是两路归并。

算法步骤

  • 不断将当前序列平均分割成两个子序列,直到不能再分割。(截止条件:序列中只剩 1 个元素
  • 不断地将 2 个子序列合并成一个有序序列,直到最终只剩下 1 个有序序列。

序列合并

合并到新序列

  • 将两个序列合并的思路为:左序列右序列的中元素挨个比较,将较小的放入新序列中,最后新序列中的元素必然升序,也就是每次都是从未比较的两个子序列的最小值中选出一个更小值。
    在这里插入图片描述

原地合并

  • 将两个序列合并时,不一定要合并到新空间,可以合理的利用原空间实现 原地合并

在这里插入图片描述

复杂度

  • 由于归并排序总是平均分割子序列,最好、最坏时间复杂度都是 O(nlogn)
  • 空间复杂度为 O(n)
  • 归并排序属于稳定排序

常见的递推式与复杂度查看表

在这里插入图片描述

归并序列代码实现

package _01_排序._06_归并排序;

/*
* 归并排序
* */
public class MergeSort {
    private static int[] leftArray;

    public static void main(String[] args) {
        int[] array = {4,3,5,1,9,8,2,0};
        leftArray = new int[array.length >> 1];

        //[begin,end)左闭右开
        divide(0,array.length,array);

        for (int i : array) {
            System.out.println(i + "_");
        }
    }

    //分开
    private static void divide(int begin, int end, int[] array){
        if (end - begin < 2) return;// 数组元素大于2, 才能进行归并排序
        int mid = (begin + end) >> 1;
        //归并排序左子序列
        divide(begin,mid,array);
        //归并排序右子序列
        divide(mid,end,array);
        //合并整个序列
        merge(begin, mid, end,array);
    }

    //合并
    private static void merge(int begin, int mid, int end, int[] array){
        int li = 0, le = mid - begin;//左边数组(基于leftArray)
        int ri = mid, re = end;//右边数组(基于 array)
        int ai = begin;//array 的索引

        //备份左边数组到leftArray
        for (int i = li; i < le; i++) {
            leftArray[i] = array[begin + i];
        }

        //如果左边还没有结束
        while (li < le){// li == le 左边结束, 则直接结束归并
            if (ri < re && array[ri] < leftArray[li]){
                // 拷贝右边数组到array
                array[ai++] = array[ri++];
            }else{
                //拷贝左边数组到array
                array[ai++] = leftArray[li++];
            }
        }
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

排序(六):归并排序 的相关文章

  • “源兼容性”和“目标兼容性”有什么区别?

    之间有什么关系 区别sourceCompatibility and targetCompatibility 当它们设置为不同的值时会发生什么 根据工具链和兼容性 https docs gradle org current userguide
  • 连接外部 Accumulo 实例和 java

    我正在尝试使用 Accumulo 连接到虚拟机 问题是 我无法将其连接到 Java 中 我可以看到 Apache 抛出的网页 但我无法让它与代码一起工作 我认为这是缺乏知识的问题而不是真正的问题 但我找不到这方面的文档 所有示例都使用 lo
  • java程序有多少种结束方式?

    我知道使用 System exit 0 可以结束一个java程序 例如 如果我有一个JFrame窗口 它会关闭并结束程序 但我想知道还有多少其他方法 可以关闭它并结束程序 包括发生错误时 程序会被关闭 JFrame也会被关闭吗 添加到其他答
  • Kafka - 如何同时使用过滤器和过滤器?

    我有一个 Kafka 流 它从一个主题获取数据 并且需要将该信息过滤到两个不同的主题 KStream
  • 如何在 Android 应用程序中隐藏 Flutterwave API 密钥

    我正在构建一个 Android 应用程序 目前正在将 Flutterwave 集成到我的应用程序中以进行支付 建议我永远不要将 Flutterwave API 密钥放在我的应用程序上 那么我该如何隐藏这些键呢 我正在使用 Retrofit
  • 查看Java Agent修改的Java类的源代码

    我需要了解 Java 代理如何修改我的初始类 以便我能够理解代码的作用 build gradle configurations jar archiveName agent2 jar jar manifest attributes Prema
  • 我们可以有条件地声明 spring bean 吗?

    有没有一种方法可以有条件地声明 Spring bean 例如
  • 通过Zuul上传大文件

    我在通过 zuul 上传大文件时遇到问题 我正在使用 apache commons 文件上传 https commons apache org proper commons fileupload https commons apache o
  • 什么是内部类的合成反向引用

    我正在寻找应用程序中的内存泄漏 我正在使用的探查器告诉我寻找这些类型的引用 但我不知道我在寻找什么 有人可以解释一下吗 Thanks Elliott 您可以对 OUTER 类进行合成反向引用 但不能对内部类实例进行合成 e g class
  • 无法使用 datastax java 驱动程序通过 UDT 密钥从 cassandra 检索

    我正在尝试使用用户定义的类型作为分区键将对象存储在 cassandra 中 我正在使用 datastax java 驱动程序进行对象映射 虽然我能够插入到数据库中 但无法检索该对象 如果我更改分区键以使用非 udt 例如文本 我就能够保存和
  • 自定义列表字段点击事件

    我正在编写一个应用程序 其中我创建了用于显示列表视图的自定义列表字段 我的 CustomListField 包含连续的一个图像和文本 我正在通过单击列表字段行获取字段更改侦听器 但我也想将字段更改侦听器放在图像上 谁能告诉我我该怎么做 这是
  • 使用 OkHttp 下载损坏的文件

    我编写的下载文件的方法总是会产生损坏的文件 public static String okDownloadToFileSync final String link final String fileName final boolean te
  • 为什么 jar 执行的通配符在 docker CMD 中不起作用?

    我有一个Dockerfile与以下CMD启动我的 Spring Boot 应用程序 FROM java 8 jre CMD java jar app file jar 当我尝试从创建的图像启动容器时 我得到 Error Unable to
  • ThreeTen 向后移植与 JSR-310 的比较

    由于某些原因 我们现在无法使用 java 8 我们仍然停留在 java 7 上 不过 我想使用新的JSR 310 date time APIs现在 使用官方向后移植 ThreeTen http www threeten org threet
  • 使用 JDBC 连接到 PostgreSql 的本地实例

    我在 Linux 机器上有一个正在运行的 PostgreSql 本地实例 当我使用psql来自 shell 的命令我成功登录 没有任何问题 我需要通过 JDBC 连接到 PostgreSql 但我不知道我到底应该传递什么url参数为Driv
  • 在java程序中使用c++ Dll

    我正在尝试使用System LoadLibrary 使用我用 C 编写的一个简单的 dll UseDllInJava java import com sun jna Library import com sun jna Native imp
  • 类更改(例如字段添加或删除)是否保持 Serialized 的向后兼容性?

    我有一个关于 Java 序列化的问题 在这种情况下 您可能需要修改可序列化类并保持向后兼容性 我有丰富的 C 经验 所以请允许我将 Java 与 NET 进行比较 在我的Java场景中 我需要使用Java的运行时序列化机制序列化一个对象 并
  • Lombok 不适用于 Eclipse Neon

    我下载了lombok jar lombok 1 16 14 jar 并将其放入我的下载中 然后我点击这个 jar 执行正确地识别了我的 MacOS 上的 Eclipse 实例 然后我选择了我想要的实例 Lombok也在pom xml中指定
  • 带 getClassLoader 和不带 getClassLoader 的 getResourceAsStream 有什么区别?

    我想知道以下两者之间的区别 MyClass class getClassLoader getResourceAsStream path to my properties and MyClass class getResourceAsStre
  • 使用 DBCP 配置 Tomcat

    在闲置一段时间 几个小时 后 我们收到了 CommunicationsException 来自 DBCP 错误消息 在异常中 位于这个问题的末尾 但我没有看到任何配置文件中定义的 wait timeout 我们应该看哪里 在 tomcat

随机推荐

  • linux bootarg 数组,Linux启动bootargs参数分析

    Linux启动bootargs参数分析 Written by leeming 这几天刚好在看linux c语言启动 现在就顺便把内核在启动时解析bootargs这一块单独拎出来讲解下 内核对于bootargs的解析分为几块 1 setup
  • linux下使用C语言操作MYSQL数据库(API使用libmysqlclient-dev)

    文章目录 运行环境 一 准备工作 1 在Ubuntu上准备mysql开发环境 2 创建测试数据库与表 二 建立与mysql的连接 1 在C文件中引入头文件 2 初始化mysql与数据库的通道 3 与mysql建立真实连接 三 添加操作 CR
  • java - 锁粒度

    最近工作有个需求 需要加锁保证操作的原子性 但在一定程度上我想着可以根据业务类型对锁进行细化 于是简单的写了一个demo进行验证 先来看看synchronized的demo import java util concurrent Concu
  • 光敏传感器实验报告_光敏传感器光电特性研究实验报告.docx

    光敏传感器光电特性研究实验报告 光敏电阻光敏特性的研究 一 实验设计方案 实验目的 1 了解光敏电阻的基本特性 测出它的光照特性曲线 2 学习使用电脑实测 3 学习使用DataStudio软件 4 学习了解设计性实验的基本方法 实验原理 光
  • tkinter美化窗口

    今天 小编给大家带来一个很常见的问题 如何美化tkinter窗口 相信用过IDLE的小伙伴都深有感受 IDLE同样使用Tcl Tk写的 别人写的是这样 我们写的却是这样 大家对比一下 tkinter写英文还算可以 但是一写中文 他的问题就凸
  • 速通AOSP,成功编译调试Android源码

    今日科技快讯 近日据不少网友反馈 爱奇艺App开始对投屏功能作出限制 之前黄金VIP会员支持最高4K清晰度投屏 现在只能选最低的480P清晰度 要想进行4K投屏必须购买白金VIP会员 不少网友表示 480P清晰度太低 几乎无法观看 作者简介
  • 初代AIGC明星独角兽,停摆在大模型元年

    唏嘘 AIGC方兴未艾 但国内AIGC领域的昔日龙头独角兽 正站在风雨飘摇的悬崖边 影谱科技 初代目AIGC明星公司 被爆已经面临经营不善 运营停摆的窘境 这家成立于2009年的AI影像公司 一直专注大文娱产业 曾在D轮融资时以13 6亿人
  • 计算机网络(六)-传输介质

    一 传输介质 1 1 传输介质也称传输媒体 传输媒介 它就是数据传输系统中在发送设备和接收设备之间的物理通路 1 2 传输媒体并不是物理层 传输媒体在物理层的下面 因为物理层是体系结构的第一层 因此有时称传输媒体为第0层 1 3 传输媒体中
  • Unity3d目录Resources与StreamingAssets文件夹的区别

    1 Resources文件夹 Resources文件夹是一个只读的文件夹 通过Resources Load 来读取对象 因为这个文件夹下的所有资源都可以运行时来加载 所以Resources文件夹下的所有东西都会被无条件的打到发布包中 建议这
  • 炸裂了!3分钟用GPT4做一个PPT!

    GPT4有多强了 相信体验过的同学都知道 一个字爽 无论是速度 还是数据集还是功能都比3 5要强大很多 现在越来越多的人开始用GPT4了 可以大幅的提高我们的工作和学习的效率 今天小编就用GPT4快速做一个PPT 分享给大家 分分钟搞定 1
  • cobra 开启自动补全功能

    cobra 开启自动补全功能 因工作原因 需要将一个由 cobra 写的命令行工具 支持在 bash 和 zsh 环境开启命令行自动补全功能 网上搜了一圈 大部分都是把 cobra github 的介绍翻译一下就完了 而且没有对命令行补全的
  • 关于JAVA毕业设计三个选题推荐

    毕业设计是大学生学习生涯的最后一课 对未来职业发展有重要影响 因此 选题是一个需要慎重考虑的问题 本文将为大家推荐三个相关的JAVA毕业设计选题 希望能够给大家提供一定的参考和帮助 基于SSH框架的学生管理系统 学生管理系统是一个常见而且非
  • JsonView插件的使用

    由于谷歌浏览器经常打不开应用商店 还有就是安装第三方插件的办法 方法就如下 由于最近做和json相关的东西 所以 以jsonView插件为例分享一下 1 打开https github com 2 搜索 jsonView 链接 https g
  • class组件使用静态变量 并且通过react编译

    ok 这种情况直接使用 babelrc 然后 npm start 会出现下面err 我试着通过 babelrc 配置 presets babel preset env babel preset react plugins babel plu
  • Mysql学习笔记九--子查询

    1 mysql表子查询 子查询是指嵌入在其他sql语句中的select语句 也叫嵌套查询 单行子查询 指只返回一行数据的子查询语句 多行子查询 指返回多行数据的子查询 使用关键字 in 如何查询和部门10的工作相同的但是不包含10号部门自己
  • 多输入多输出

    多输入多输出 MATLAB实现BP神经网络多输入多输出预测 目录 多输入多输出 MATLAB实现BP神经网络多输入多输出预测 预测效果 基本介绍 程序设计 参考资料 预测效果
  • 服务的边界

    服务边界是服务拆分和集成的前提 1 识别业务领域及边界 当前主要方法论 领域驱动设计 领域可简单理解为特定的业务系统 其中主要的设计维度为策略维度和技术维度 待完善 2 界限上下文 就是根据界限 边界 确定上下文 具体的业务场景 3 服务边
  • css3 transform + deviceorientation实现图片旋转效果

    1 陀螺仪deviceorientation的使用 参考 关于陀螺仪deviceorientation https segmentfault com a 1190000007183883 2 transform各属性的具体使用 参考 深入理
  • 计算机组成原理——单周期CPU

    单周期CPU 项目代码 实验原理 MIPS指令 rom coe文件 代码 顶层模块SingleCycleCPU display外围模块 PC instructionMemory Alu模块 DataMemory ControlUnit 旧的
  • 排序(六):归并排序

    排序算法系列文章 排序 一 冒泡排序 排序 二 选择排序 排序 三 堆排序 排序 四 插入排序 排序 五 二分搜索 排序 六 归并排序 排序 七 快速排序 排序 八 希尔排序 目录 排序算法系列文章 归并排序 Merge Sort 基本思想