两路归并排序

简介

一般来说,排序算法主要被分为两类,即基于比较的算法和基于非比较的算法。插入排序,冒泡排序和希尔排序是基于比较模型的。这三个算法的问题是它们的复杂度都是O(n^2),所以它们非常慢。

那么有没有比O(n^2)更快的排序列表的方法呢?答案是有的,下面就让我们看看这么一个算法。

之前提到的三个算法(插入、冒泡和希尔)的共同特点是,我们是从原始列表里把元素两两取出,然后进行比较的
在这里插入图片描述
插入排序和冒泡排序使用了太多的比较,这也是归并排序需要克服的地方

在原始列表中进行比较不是最好的方式,而且我们也不需要这么做。作为替代做法,我们可以尝试将列表分成更小的子列表然后排序他们。在排序完更小的子列表以后(这么做比直接排序整个原始列表要简单),我们可以尝试将小的子列表合并成一个有序列表。这个技术就是典型的“分治”法(分而治之)。

一般来说,如果一个问题太难以至于无从下手,我们可以尝试将它分成较小的子问题,然后尝试解决这些子问题。然后我们可以将子问题的结果合并起来(从而解决原始问题)。
在这里插入图片描述

如果排序大列表太困难,我们可以将它分割成更小的子列表,然后排序它们

归并排序是一个基于分治法的比较排序算法。目前看来还不错,当我们有一个非常大的列表需要排序,显然,如果将列表分成两个子列表,然后再排序会更好些。如果等分以后还是太大,我们就继续分割,直到可以很简单地排序为止(参见下图)。

在这里插入图片描述

“归"与"并”

一个恰当的比喻

"归并排序"类似“比武擂台赛”:无论参赛者有多少人,主办方都可以让他们亮亮在擂台上比试,第一轮的获胜者再两两分组,继续比试,一直决出冠军为止
在这里插入图片描述

归并排序

归并排序的与上面的类似又有不同

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

归[分组]

第一步就是要把逐层的折半分组
在这里插入图片描述

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

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

因此,当每个小组内部比较出先后顺序以后,小组之间会展开进一步的比较和排序,合并成一个大组;大组之间继续比较和排序,再合并成更大的组…最终,所有元素合并成了一个有序的集合。
在这里插入图片描述
这个比较与合并的过程叫做归并,对应英文单词merge,这正是归并排序名字的由来。

如何将两个有序集合合并成一个有序的大集合?

在这里插入图片描述
3步:
第一步,创建一个额外大集合用于存储归并结果,长度是两个小集合之和。(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各右移一位:
在这里插入图片描述
此时左侧的小集合已经没有元素可用了。

第三步,从另一个还有剩余元素的集合中,把剩余元素按顺序复制到大集合尾部。
在这里插入图片描述

好与坏

为什么归并排序如此有用

快捷和稳定

归并排序成为一个非常棒的排序算法主要是因为它的快捷和稳定。它的复杂度即使在最差情况下都是O(n log n)。而快速排序在最差情况下的复杂度是O(n^2),当n=20的时候,它比归并要慢4.6倍。

在这里插入图片描述

规定排序的最好最差最平均的情况下都是(n log n),十分稳定

容易实现

另一个理由是归并排序很容易实现。诚然,大多数开发者认为速度快的算法总是难以实现,但是这条守则并不适用于归并排序的情况。

归并排序不那么实用的三个理由

比非比较排序算法慢

归并算法是基于比较模型的,因此它要比在线性时间里排序数据的非比较算法要慢。当然,这也与输入数据有关,所以我们要仔细对待输入。

在数据基本有序的情况下,它比冒泡和插入排序要慢

再一次提醒,要了解输入数据的重要性。如果输入数据基本已经有序,那么插入和冒泡排序会更快。插入和冒泡排序在最好的情况下复杂度是O(n),然而归并排序的最好情况是O(n log n)。

作为总结,我想说在实践中,归并排序是最好的排序算法毋庸质疑,因为它易于实现而且快捷,所以每个开发者都应该牢记它。

归并排序和堆排序、快速排序的比较

若从空间复杂度来考虑:首选堆排序,其次是快速排序,最后是归并排序。

若从稳定性来考虑,应选取归并排序,因为堆排序和快速排序都是不稳定的。

若从平均情况下的排序速度考虑,应该选择快速排序。

图说归并排序
漫画:什么是归并排序?
归并排序
排序(7):归并排序
多路归并排序

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章