算法——排序——归并排序图解动画

2023-11-11

简介

        归并排序分为两部分:分解,合并。

        分解:归并算法会把数组分成两个长度相同的子数组,直到无法再分割,每个数组只有一个元素。此过程不消耗时间资源。对应的时间复杂度为O(1)。
        合并:首先比较两个数组内的各个元素大小,然后根据比较结果将两个数组合并成一个有序数组。此过程会将每行的所有的子数组内的所有元素进行一次比较合并,所以完成一行的归并操作所对应的时间复杂度为O(N)。
        分解元素时采用的是二分法对半分割,所以数组被分解为log2N次,即8个元素的数组会被分解三次。所以合并时,也总计需要log2N次的时间合并。

        因为共有N个元素,且分解log2N次。 所以两者总计时间为O(N*log2N)。将log2N次的数据合并完成后,排序结束。

        文章中使用的动画网站地址,限 pc: 排序算法动画
http://www.donghuasuanfa.com/sort

        算法一览表:https://blog.csdn.net/ww753951/article/details/106862328

代码示例

来自百度百科

public class MergeSort {   
    public static int[] mergeSort(int[] nums, int l, int h) {
        if (l == h)
            return new int[] { nums[l] };
         
        int mid = l + (h - l) / 2;
        int[] leftArr = mergeSort(nums, l, mid); //左有序数组
        int[] rightArr = mergeSort(nums, mid + 1, h); //右有序数组
        int[] newNum = new int[leftArr.length + rightArr.length]; //新有序数组
         
        int m = 0, i = 0, j = 0; 
        while (i < leftArr.length && j < rightArr.length) {
            newNum[m++] = leftArr[i] < rightArr[j] ? leftArr[i++] : rightArr[j++];
        }
        while (i < leftArr.length)
            newNum[m++] = leftArr[i++];
        while (j < rightArr.length)
            newNum[m++] = rightArr[j++];
        return newNum;
    }
    public static void main(String[] args) {
        int[] nums = new int[] { 9, 8, 7, 6, 5, 4, 3, 2, 10 };
        int[] newNums = mergeSort(nums, 0, nums.length - 1);
        for (int x : newNums) {
            System.out.println(x);
        }
    }
}

排序过程

分解

        首先进行第一部分分解处理,将数量为N的数组分解为只有一个元素的数组。

合并

         1.首先将45和6置成灰色进行比较,因为45大于6,所以合并时将6和45互换位置。
         2.比较23和12的位置,因为23大于12。所以合并时互换位置。
         3.此时合并后分为两个数组[6,45]和[12,23]。再将 [6,45]和[12,23]进行合并。每个数组从左到右比较数组内元素的值,将比较后较小的元素放到对应的位置。最终数组整体排序完成。

在这里插入图片描述

时间复杂度

最差时间复杂度 平均时间复杂度 最优时间复杂度
O ( N ∗ l o g 2 N ) O(N*log_{2}N) O(Nlog2N) N ∗ l o g 2 N N*log_{2}N Nlog2N N ∗ l o g 2 N N*log_{2}N Nlog2N

在这里插入图片描述

        上半部分,分的过程。归并排序的时间复杂度恒定为 N*log2N。将数组分解为单个元素分解的时间为O(1)。即默认可认为元素已分解为单个元素。
        下半部分,治的过程。每一层的各个元素都要进行比较,每层各个元素比较的过程的时间复杂度为N。共需要进行 log2N 次的合并(例如:8位数组的合并次数为 log28=3,4位的为log24=2)。所以总计的时间复杂度为 N *log2N 。

空间复杂度

        插入排序需要的空间复杂度为 O(N)。即:每一层的处理都需要额外的与数组相同的空间存储新一层的数据。理论上合并的总的空间复杂度为 N *log2N (分的过程由于可直接认为数组为已分割的单个元素数组,所以分的时间复杂度忽略不计)。
        每次元素合并后,占用的空间可释放,所以时间空间复杂度不是 N *log2N。而是 O(N)。

稳定性

        两个元素的值相同时如果最终排序完成后位置不变,则为稳定排序,如果位置变更则为不稳定排序。
        排序算法中,如果数字相同,则无需变更位置,避免额外的操作。归并排序,比较判断时,无需更换位置也能达到排序效果,所以为稳定排序。

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

算法——排序——归并排序图解动画 的相关文章

  • Qt教程7--一个事件触发另一个

    Qt教程一 第七章 一个事物领导另一个 原文 QT3 1的帮助文档翻译 zieckey zieckey yahoo com cn 修改 zieckey zieckey yahoo com cn 这个例子显示了如何使用信号和槽来创建自定义窗口
  • 【RDMA】最全RDMA学习教程(建议收藏)

    目录 RDMA技术分享 RDMA技术分享 RDMA技术详解 RDMA编程 RDMA 网络 ROCE iWarp 性能优化 配置和特性优化 Qos流控 命令和测试 文档和相关资料 作者 bandaoyu 随时更新 源文连接 https blo

随机推荐

  • 图片上传的ajax代码,一个伪ajax图片上传代码实现示例

    if FILES gt window parent ajaxUploadPicture uploadCallback http img0 bdstatic com img image 5099213b07eca8065380ce7f75e9
  • tensorflow官方教程:运用模型对类别进行预测

    tensorflow官方教程 运用模型对类别进行预测 本文主要包含如下内容 tensorflow官方教程运用模型对类别进行预测 python版本 C代码 本教程将会教你如何使用Inception v3 你将学会如何用Python或者C 把图
  • ubuntu 安装Fastdfs

    安装fastdfs依赖插件libfastcommon 下载 https github com happyfish100 libfastcommon archive V1 0 39 tar gz 创建 usr local software 目
  • 蓝桥杯 BEGIN-2 long long int的使用

    include
  • 机房环境监控系统的作用,环境与设备监控系统的作用

    通信机房环境监控系统 以下简称动环监控系统 是指电源柜 UPS 监控 远程通信 远程调试 远程控制 即时监控其运行参数 故障检测和处理 记录和分析的有关数据 对其设备 空调 电池等工业设备以及门磁 红外 渗水 温湿度 烟度等环境参数进行统一
  • 别只盯着“四小龙”,CV的市场格局正在悄悄改变

    大数据产业创新服务媒体 聚焦数据 改变商业 在计算机视觉领域 比较知名的是商汤 旷视 云从 依图这 四小龙 他们不仅知名度更高 收入水平和估值也更高 从最新的财报来看 这四小龙都不同程度陷入了困境 收入增长乏力 巨额亏损看不到扭转的态势 四
  • crc16 ccitt的详细标准及其出处

    CRC16 CCITT是一个16位的循环冗余校验 CRC 算法 它是由国际电报电话咨询委员会 CCITT 制定的 该算法被广泛用于通信领域 以验证数据传输的完整性 以下是CRC16 CCITT算法的详细标准 多项式生成器 Polynomia
  • weblogic wls-wsat组件远程命令执行(CVE-2017-3506)

    所有文章 仅供安全研究与学习之用 后果自负 weblogic wls wsat组件远程命令执行 CVE 2017 3506 前言 与weblogic 反序列化 CVE 2017 10271 类似 一般情况下weblogic会开放7001以及
  • (port is already in use)端口被占用问题

    前言 端口占用问题几乎每个开发人员都会遇到 每次用每次查 下面来记录下解决过程 以便日后需要 正文 1 调出命令窗口 windows R 组合键 调出命令窗口 2 查找占用端口对应的PID 进程号 说明 以下举例用到的端口和进程等仅做参考
  • Cadence Allegro PCB快捷键设置

    1 通过env文件设置快捷键 在安装路径下D Cadence SPB 16 6 share pcb text中找到env文件 利用记事本打开 就可以加入自己的快捷键方式了 二 env文件在哪里 以我的电脑为例 在安装路径下D cadence
  • 实现点击图片放大查看功能

    1 html 代码 div style display none text align center width 100 height 100 background color none img style height 1 width 4
  • unity物体自身轴旋转_unity3d如何实现物体自动旋转-unity3d物体自动旋转的设置教程 - 河东软件园...

    unity3d是我们设计师用来制作游戏画面的软件 很多的手机App也可以使用它来制作 有的时候我们在游戏中能够看见一些人物或是物体的移动效果 例如平移 旋转等等都可以轻松的利用这款软件来实现 今天小编想和大家分享一下如何在unity3d中使
  • 2020-08-13

    https www cnblogs com daizhengyang p 13384169 html https blog csdn net qq 27289001 article details 77150598 https www cn
  • oracle学习之rownum和rowid

    rownum先百度一波https www cnblogs com xfeiyun p 16355165 html rownum是oracle特有的一个关键字 对于基表 在insert记录时 oracle就按照insert的顺序 将rownu
  • 编程的未来

    从 ChatGPT 诞生至今 在程序员的圈子里 我们一直有两种讨论 最开始所恐慌的 编程没有未来 ChatGPT 是不是要取代程序员 编程的方式前所未有地发生了变化 现如今 GitHub Copilot Chat 可以让开发者们直接在编辑器
  • 使用python分析数据分布

    要使用 Python 分析数据分布 你可以使用 Python 中的数据可视化库 如 matplotlib 或 seaborn 例如 你可以使用 matplotlib 的 hist 函数绘制数据的直方图 以查看数据的分布情况 你也可以使用 s
  • redis-cli报错Could not connect to Redis at 127.0.0.1:6379: Connection refused

    新手安装完redis后想要使用redis cli连接但是报错 为什么会报这个错呢 首先启动redis server 看能否启动 启动命令式 redis server 然后 1如果修改了IP地址 比如说改成了192 168 66 66 那么执
  • 中移物联ML302 4G Cat1 模组TCP/UDP 实现流程

    中移物联ML302 4G Cat1 模组TCP UDP 实现流程 注意 下文种的 表示 r n 一 首先AT 00 57 34 794 发 AT 00 57 35 756 发 AT 00 57 35 760 收 AT OK 二 查询卡CIM
  • 并发策略之分工原则

    本文主要思想来自 Java虚拟机并发编程 薛笛 译 为什么要用并发 并发是再在有限的资源下提高性能的有效手段 当然现在互联网环境下并发访问的现象也比比皆是 但是本文并不涉及处理并发访问 而是使用并发手段解决复杂任务的策略 另外关于并发和并行
  • 算法——排序——归并排序图解动画

    归并排序 简介 代码示例 排序过程 分解 合并 时间复杂度 空间复杂度 稳定性 简介 归并排序分为两部分 分解 合并 分解 归并算法会把数组分成两个长度相同的子数组 直到无法再分割 每个数组只有一个元素 此过程不消耗时间资源 对应的时间复杂