动画 | 什么是归并排序?

归并排序的归并这两个字和递归没有关系,归并是将两个有序的数组归并成一个更大的有序数组,但整个排序算法是有可能跟递归有关系的。因为归并排序算法可以按照递归方式去解决,也可以按照迭代方式去解决。

递归方式是自顶向下的归并排序,迭代方式是自底向上的归并排序。这两种归并排序虽然实现方式不同,但是都是调用了核心的方法:归并操作。

归并操作merge

我们可以声明一个方法merge(数组对象, low, mid, high),假设array[low>>>mid]和array[mid+1>>>high]这两个序列都是有序的,在merge之前创建一个和array数组长度相同的空的辅助数组aux,然后在merge之后将原数组中的待排序列[low>>>high]拷贝到辅助数组aux,设置两个游标i和j分为位于aux [low>>>mid]和aux [mid+1>>>high]的起始位置。

辅助数组aux的任务有两项:根据游标i和j比较元素的大小;并在aux中逐个取得有序的元素放入原数组array相应的位置中。

如果aux的两段序列aux [low>>>mid]和aux [mid+1>>>high]中,其中一段已经全部放到原数组array中了,那么另一段剩余的序列直接放到原数组array的末尾。

动画

算法动画视频 地址

Code
file

根据merge方法代码里条件,有4个判断情形:

1.左半边用尽,取右边的元素;

2.右半边用尽,取左边的元素;

3.右半边的当前元素小于左半边的当前元素,取右半边的当前元素;

4.右半边的当前元素大于等于左半边的当前元素,取左半边的当前元素。

自顶向下的归并排序(递归法)

自顶向下的归并排序的基于递归的,递归终止的条件是子序列长度为1。递归终止的条件是可以改的,如果在使用递归进行归并排序算法中,可能会遇到大量数据导致递归的使用过于频繁,从而导致性能消耗太大。

所以递归终止条件可以改为子序列长度为N(适量),然后这个子序列可以进行插排或者其它更合适的排序。

基于递归的归并排序算法的思想可以分为3个过程:

分解:将当前待排序列array[low>>>high]一分为二,分裂点在mid = low + (high - low) / 2;

递归:递归分解array[low>>>mid]和array[mid+1>>>high];

归并:达到终止条件后,可以进行归并操作,将两个已排序子序列归并成一个新的有序序列。

动画

算法动画视频 地址

Code
file
Result

初始状态 [13, 9, 15, 11, 3, 7, 17, 5, 1]
归并 [9, 13, 15, 11, 3, 7, 17, 5, 1]
归并 [9, 13, 15, 3, 11, 7, 17, 5, 1]
归并 [3, 9, 11, 13, 15, 7, 17, 5, 1]
归并 [3, 9, 11, 13, 15, 7, 17, 1, 5]
归并 [3, 9, 11, 13, 15, 1, 5, 7, 17]
归并 [1, 3, 5, 7, 9, 11, 13, 15, 17]
[1, 3, 5, 7, 9, 11, 13, 15, 17]

优化:对小规模子数组使用插排

如果数据量太大,可以进行更改递归终止条件,改为处理小规模的问题,这种方法可以改进大多数递归算法的性能

Code
file

优化:merge之前测试数组是否已经有序

达到递归终止条件后,进行归并操作之前,还少了一个判断的条件。如果array[mid]要小于等于array[mid+1],说明array[low>>>high]本身就是有序的了,可以直接跳过归并操作。这个改动不会影响递归的调用。

Code
file

自底向上的归并排序(迭代法)

自底向上的归并排序是基于循环的,它不像递归那样将一个大问题分割成一个个能解决的小问题,然后用所有小问题的答案来解决这个大问题。基于循环的算法是从无到有,从能解决的小问题开始,慢慢解决大问题。

基于迭代的归并排序可以分为两个过程:

归并:从子序列长度为1(length)开始,进行两两归并,得到2 * length 的有序序列;

循环:子序列长度改为2 * length开始,进行两两归并,终止条件是直到原数组已经归并完毕。

动画

算法动画视频 地址

Code
file
Result

初始状态 [13, 9, 15, 11, 3, 7, 17, 5, 1]
归并 [9, 13, 15, 11, 3, 7, 17, 5, 1]
归并 [9, 13, 11, 15, 3, 7, 17, 5, 1]
归并 [9, 13, 11, 15, 3, 7, 17, 5, 1]
归并 [9, 13, 11, 15, 3, 7, 5, 17, 1]
归并 [9, 11, 13, 15, 3, 7, 5, 17, 1]
归并 [9, 11, 13, 15, 3, 5, 7, 17, 1]
归并 [3, 5, 7, 9, 11, 13, 15, 17, 1]
归并 [1, 3, 5, 7, 9, 11, 13, 15, 17]
[1, 3, 5, 7, 9, 11, 13, 15, 17]

喜欢本文的朋友,微信搜索「算法无遗策」公众号,收看更多精彩的算法动画文章

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 数据结构与算法--归并排序 归并排序 归并排序基于一种称为“归并”的简单操作。比如考试可能会分年级排名和班级排名,...
    sunhaiyu阅读 869评论 0 6
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,164评论 0 52
  • 1 初级排序算法 排序算法关注的主要是重新排列数组元素,其中每个元素都有一个主键。排序算法是将所有元素主键按某种方...
    深度沉迷学习阅读 1,391评论 0 1
  • 分治策略 本文包括分治的基本概念二分查找快速排序归并排序找出伪币棋盘覆盖最大子数组 源码链接:https://gi...
    廖少少阅读 1,830评论 0 7
  • 今晚围观了成人芭蕾舞蹈班。 都不是专业人士,身材高矮胖瘦都有,水平也不是太高,但是大家认真坚持的态度却还是感染了我...
    轩儿柳漫轩阅读 776评论 0 2