简介

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

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

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

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

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

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

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

图说归并排序

好与坏

为什么归并排序如此有用

快捷和稳定

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

图说归并排序

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

容易实现

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

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

比非比较排序算法慢

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

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

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

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

示例图

图说归并排序

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

相关文章:

  • 2021-10-07
  • 2021-12-12
  • 2021-09-29
  • 2021-11-13
  • 2021-06-13
  • 2021-10-25
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-01-01
  • 2021-12-13
  • 2021-12-30
  • 2022-03-05
  • 2022-12-23
  • 2021-07-24
相关资源
相似解决方案