漫画:什么是归并排序?

—————  第二天  —————

————————————

举个例子,有A、B、C、D、E、F、G、H一共8个武术家参考参加比武大会。

第一轮,两两一组,有4名选手胜出(四分之一决赛)

第二轮,两两一组,有两名选手胜出(半决赛)

第三轮,仅剩的两人一组,冠军胜出(总决赛)

归并排序和擂台赛,有什么相同和不同之处呢?让我们以下面这个数组来举例说明:

归并排序就像是组织一场元素之间的“比武大会”,这场比武大会分成两个阶段:

1.分组

假设集合一共有n个元素,算法将会对集合进行逐层的折半分组。

第一层分成两个大组,每组n/2个元素;

第二层分成4个小组,每组n/4个元素;

第三层分成8个更小的组,每组n/8个元素;

......

一直到每组只有一个元素为止。

这样一来,整个数组就分成了一个个小小的“擂台”。

2.归并

既然分了组,接下来就要开始“比武”了。

归并排序和擂台赛有一个很大的不同,就是擂台赛只需要决定谁是老大,而并不关心谁做老二和老三;归并排序的要求复杂一些,需要确定每一个元素的排列位置。

因此,当每个小组内部比较出先后顺序以后,小组之间会展开进一步的比较和排序,合并成一个大组;大组之间继续比较和排序,再合并成更大的组......最终,所有元素合并成了一个有序的集合。

这个比较与合并的过程叫做归并,对应英文单词merge,这正是归并排序名字的由来。

归并操作需要哪三个步骤呢?我们以两个长度为4的集合为例:

第一步,创建一个额外大集合用于存储归并结果,长度是两个小集合之和。(p1,p2,p是三个辅助指针,用于记录当前操作的位置)

第二步,从左到右逐一比较两个小集合中的元素,把较小的元素优先放入大集合。

由于1<2,所以把元素1放入大集合,p1和p各右移一位:

由于2<3,所以把元素2放入大集合,p2和p各右移一位:

由于3<7,所以把元素3放入大集合,p1和p各右移一位:

由于5<7,所以把元素5放入大集合,p1和p各右移一位:

由于6<7,所以把元素6放入大集合,p1和p各右移一位:

此时左侧的小集合已经没有元素可用了。

第三步,从另一个还有剩余元素的集合中,把剩余元素按顺序复制到大集合尾部。

这样一来,两个有序的小集合就归并成了一个有序的大集合。

static public void mergeSort(int[] array, int start, int end){if(start < end){//折半成两个小集合,分别进行递归int mid=(start+end)/2;mergeSort(array, start, mid);mergeSort(array, mid+1, end);//把两个有序小集合,归并成一个大集合merge(array, start, mid, end);}
}
static private void merge(int[] array, int start, int mid, int end){//开辟额外大集合,设置指针int[] tempArray = new int[end-start+1];int p1=start, p2=mid+1, p=0;//比较两个小集合的元素,依次放入大集合while(p1<=mid && p2<=end){if(array[p1]<=array[p2])tempArray[p++]=array[p1++];elsetempArray[p++]=array[p2++];}//左侧小集合还有剩余,依次放入大集合尾部while(p1<=mid)tempArray[p++]=array[p1++];//右侧小集合还有剩余,依次放入大集合尾部while(p2<=end)tempArray[p++]=array[p2++];//把大集合的元素复制回原数组for (int i=0; i<tempArray.length; i++)array[i+start]=tempArray[i];
}
public static void main(String[] args) {int[] array = { 5, 8, 6, 3, 9, 2, 1, 7 };mergeSort(array, 0, array.length-1);System.out.println(Arrays.toString(array));
}

—————END—————

关注下方二维码,订阅更多精彩内容

 朕已阅

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

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

相关文章

世界上没有技术驱动型公司

点击上方“Java中文社群”&#xff0c;选择“设为星标”终身学习者&#xff0c;以编程为乐&#xff01;来源&#xff1a;zhihu.com/question/312019918/answer/608965942作者介绍&#xff1a;智煜徽&#xff0c;洛林大学计算机专业研究生&#xff0c;现就职于华为&#xff0c;从…

单片机Proteus7.8仿真和Proteus8.6仿真 LED点阵 温度采集 电子琴 温度报警 电子秤 音乐播放器 PWM 电压表 温度计 交通灯

单片机Proteus7.8仿真&#xff1a; 单片机Proteus8.6仿真&#xff1a; 下载地址&#xff1a; 关注公众号&#xff0c;获取资料 部分仿真图&#xff1a; 下载地址&#xff1a; 关注公众号&#xff0c;获取资料

InnoDB的内存结构和特性

常言说得好&#xff0c;每个成功男人背后都有一个为他默默付出的女人&#xff0c;而对于MySQL来说&#xff0c;这个“人”就是InnoDB存储引擎。MySQL区别于其他数据库的最为重要的特点就是其插件式的表存储引擎。而在众多存储引擎中&#xff0c;InnoDB是最为常用的存储引擎。从…

Maven必知的7个问题,你会吗?

点击上方“Java中文社群”&#xff0c;选择“设为星标”终身学习者&#xff0c;以编程为乐&#xff01;原文&#xff1a;https://www.jianshu.com/p/20b39ab6a88c在如今的互联网项目开发当中&#xff0c;特别是Java领域&#xff0c;可以说Maven随处可见。Maven的仓库管理、依赖…

Linux 小知识翻译 - 「Linux的吉祥物企鹅叫什么名字?」

这次说说Linux的吉祥物 *企鹅* 都知道Linux的吉祥物是企鹅&#xff0c;但是这个企鹅叫什么名字呢&#xff1f; 它的名字就是「Tux」&#xff0c;注意可不是「Tax」(税收)。 具体参考 wiki&#xff1a;中文解释 英文的解释更为详细一些&#xff1a;英文解释 Linux内核发展到 v2…

WordPress修改WordPress地址和站点地址之后无法打开网站和无法后台登录

WordPress地址一定不要修改。 WordPress修改WordPress地址和站点地址之后无法打开网站和无法后台登录的解决方法&#xff1a; 1、使用ssh登录服务器 xshell、SecureCRT等工具均可。 2、登录MySQL数据库 使用如下指令后&#xff0c;输入密码&#xff0c;打开mysql数据库&am…

从JVM入手,聊聊Java的学习和复习!

我们在学习的时候&#xff0c;经常会遇到这样一个问题&#xff1a;「学完就忘」这个问题大部分人都会遇到&#xff0c;那么我们今天就来聊聊&#xff0c;为啥会学了就忘呢&#xff1f;我根据自己的学习经验&#xff0c;大致总结以下三点原因&#xff1a;1、知识没有用起来2、没…

Activity和Service交互

2019独角兽企业重金招聘Python工程师标准>>> As discussed in the Services document, you can create a service that is both started and bound. That is, the service can be started by calling startService(), which allows the service to run indefinitely…

Redis从入门到精通|干货篇

点击上方“Java中文社群”&#xff0c;选择“设为星标”终身学习者&#xff0c;以编程为乐&#xff01;来源&#xff1a;http://rrd.me/eDY9S常用的 SQL 数据库的数据都是存在磁盘中的&#xff0c;虽然在数据库底层也做了对应的缓存来减少数据库的 IO 压力。由于数据库的缓存一…

最重要的7个Drupal内核模板文件

Drupal内核拥有40多个模板文件&#xff0c;其中最重要的有7个。它们组成了页面的主要部分&#xff0c;在定制Drupal主题时经常要用到。因此列表如下供大家参考。 模板名原始位置用途html.tpl.phpmodules/system打印HTML文档的结构。包括了<head>标记中的内容&#xff0c;…

Java中的13个原子操作类

点击上方“Java中文社群”&#xff0c;选择“设为星标”终身学习者&#xff0c;以编程为乐&#xff01;来源&#xff1a;https://www.iteye.com/blog/xiaoheng-2509522atomic 包中的 13 个类&#xff0c;属于 4 中类型的原子更新方式.原子更新基本类型原子更新数组原子更新引用…

Redis中的键值过期操作

1.过期设置 Redis 中设置过期时间主要通过以下四种方式&#xff1a; expire key seconds&#xff1a;设置 key 在 n 秒后过期&#xff1b;pexpire key milliseconds&#xff1a;设置 key 在 n 毫秒后过期&#xff1b;expireat key timestamp&#xff1a;设置 key 在某个时间戳…

天意PE维护系统 V2021.7.16版

天意PE U盘维护系统是一款用于系统维护和装机的U盘PE系统&#xff08;U盘启动盘&#xff09;&#xff0c;采用双PE模式,支持UEFI双启动&#xff0c;集成常用工具的维护软件&#xff0c;集成SRS驱动&#xff0c;新版更加上了NVME硬盘的支持&#xff0c;天意U盘维护系统纯净、稳定…

Redis持久化的几种方式——深入解析RDB

Redis 的读写都是在内存中&#xff0c;所以它的性能较高&#xff0c;但在内存中的数据会随着服务器的重启而丢失&#xff0c;为了保证数据不丢失&#xff0c;我们需要将内存中的数据存储到磁盘&#xff0c;以便 Redis 重启时能够从磁盘中恢复原有的数据&#xff0c;而整个过程就…

【LeetCode】148. Sort List

Sort List Sort a linked list in O(n log n) time using constant space complexity. 要求时间复杂度为O(nlogn)&#xff0c;那么不能用quickSort了&#xff08;最坏O(n^2)&#xff09;&#xff0c;所以使用mergeSort. 通常写排序算法都是基于数组的&#xff0c;这题要求基于链…

WordPress网站搬家教程(根目录程序+ MySQL数据库)

WordPress博客网站怎么搬家到新的服务器上&#xff1f;WordPress搬家无非是两点&#xff0c;即WP程序文件和数据库&#xff0c;具体什么系统不用考虑&#xff1a; 3分钟详解WordPress搬家教程 本文新手站长网关于WordPress搬家教程是帮大家缕清思路&#xff08;参考&#xff1…

Redis持久化的几种方式——RDB深入解析

点击上方“Java中文社群”&#xff0c;选择“设为星标”终身学习者&#xff0c;以编程为乐&#xff01;Redis 的读写都是在内存中&#xff0c;所以它的性能较高&#xff0c;但在内存中的数据会随着服务器的重启而丢失&#xff0c;为了保证数据不丢失&#xff0c;我们需要将内存…

配置Debian11服务器允许root用户远程SSH登录

全新安装系统后&#xff0c;默认情况下将禁用Debian Linux上的root登录。当您尝试以root用户身份登录Debian11 Linux服务器时&#xff0c;访问将被拒绝。要在Debian Linux系统上为root用户启用SSH登录&#xff0c;您需要首先配置SSH服务器。 0.首先安装SSH 注意&#xff1a;如…

带你深入浅出的分析 HashTable 源码

Hashtable 一个元老级的集合类&#xff0c;早在 JDK 1.0 就诞生了&#xff0c;今天小编想和大家一起来揭开它的面纱&#xff01;01、摘要在集合系列的第一章&#xff0c;咱们了解到&#xff0c;Map 的实现类有 HashMap、LinkedHashMap、TreeMap、IdentityHashMap、WeakHashMap、…

Debian11服务器系统默认不存在sudo命令的解决办法

1.切换到root用户&#xff0c;安装vim&#xff0c;修改镜像源文件 apt-get install vim vim /etc/apt/sources.list注释掉原有的内容&#xff0c;添加如下阿里云的镜像源 deb http://mirrors.aliyun.com/debian/ bullseye main contrib deb-src http://mirrors.aliyun.com/…