合并排序与其他两个专业不同O(n log n)算法,因为它不需要随机访问被排序的序列。
合并排序因此通常用于排序链接列表s、 以及在磁盘上 结构太大了,放不进去核心此外,合并排序不需要破坏性修改,所以很容易实施插入纯函数的语言。例如,在哈斯克尔:

合并::订单a=>[a]->[a]->[a]合并l[]=l合并[]l=l合并l@(x:xs)m@(y:ys)=如果x≤y然后x个:(合并xs-m)其他的:(合并Lys)中缀0`合并`奥德文::[a]->([a],[a])oddevn[&#93=([],[])oddevn[x]=([x],[])oddevn(x:xs)=pr=oddevn xs在里面(x:信噪比公共关系,有限状态试验公关)合并::订单a=>[a]->[a]mergesort[&#93=[]合并排序[x&#93=[x]合并排序l=pr=oddevn l在里面合并排序(有限状态试验pr)`merge`mergesort(信噪比公关)

普通人合并排序指南

它是什么?

合并排序是用于对一组项进行排序的许多方法之一。如果您有大量项目,例如联合国组织卡片,如果将它们全部放在手中并使用冒泡排序(即有多少人会自然地对卡片或其他物品进行分类)。

它还经常用于对中的大型列表进行排序计算机科学,因为它在将大集合分解为更小、更易于管理的排序任务时非常有利。

合并:基本任务

合并排序的基本思想是,您可以获取两组已排序的项,并通过一系列简单的比较快速合并它们。下面是合并工作原理的示例:

X(X)X X X第1步:X X XX X X XX X X XX X X X X X X X机组1机组2组合机组

正如你所见,第1步由两组已经分类的木棍组成。我们的目标是将两者合并为一个排序集。

X(X)X X X第二步:X X XX X X XX X X X XX X X X X X X X机组1机组2组合机组

第2步,我们比较了每个集合的第一个成员,发现集合2中的第一项最小,所以我们将其添加到组合集合中。

XX X X步骤3:X X XX X X XX X X XX X X X X X X X机组1机组2组合机组

步骤3,我们比较了每个集合的第一个成员,发现集合1中的第一项最小,因此我们将其添加到组合集合中。

X(X)X X步骤4:X X XX X X XX X X XX X X X X X X X机组1机组2组合机组

第4步,我们比较了每个集合的第一个成员,发现集合2中的第一项最小,所以我们将其添加到组合集合中。

X(X)X X X步骤5:X X XX X X XX X X XX X X X X X X X机组1机组2组合机组

第5步,我们比较第一个成员并查看集合2中的第一项是最小的,因此我们将其添加到组合集合中。

XX X X第六步:X X XX X X XX X X XX X X X X X X X机组1机组2组合机组

第6步,我们看到集合2在开始时是空的,所以我们可以将已经排序的集合1的剩余部分添加到组合集合中。因此,组合集已经排序。

使用合并排序的可视化示例

X X X XX X X X X X X XX X X X X X X X步骤1:X X X X X X X X X X X X X X X XX X X X X X X X X-X X XX X X X X X X X XX X X X-X X XX X X X X X X X X-X X X×X X X

第1步显示了长度为1到7的“木棍”的随机分布。我们希望使用mergesort对这些进行排序,以便最短的棒位于左侧。

X X X XX X X X X X X XX X X X X X X X×X X X第二步:X X X X X X X X X X X X X X XX X X X X X X X X-X X XX X X X X X X X XX X X X-X X XX X X X X X X X X-X X X×X X X

第2步是比较集合中每对成员并将较小的放在左边的结果。1/2、3/4、5/6、7/8、13/14和15/16已经正确放置在左边的小的位置上,但我们将9/10和11/12的位置调换了。

X X X XX X X X X X X XX X X X X X X X×X X X第三步:X X X X X X X X XX X XX X X X X X X X X-X X XX X X X X X X X XX X X X-X X XX X X X X X X X X-X X X×X X X

步骤3是排序过程变得直观的步骤。现在我们已经按顺序排列了每对,我们将相邻的对合并(1/2合并为3/4;5/6合并为7/8;依此类推)。这是通过比较每对中最小的(即第一个)成员,然后选择这两个成员中最小的,然后重复,直到两对都清空。因此,1-4被排序,5-8、9-12和13-16也是如此。

X X X XX X X X X X X XX X X X X X X X×X X X第四步:X X X X X X X X XX X XX X X X X X X X X-X X XX X X X X X X X XX X X X-X X XX X X X X X X X X-X X X×X X X

第4步是已经排序的集合1-4和5-8的合并,以及集合9-12和13-16的合并。只需比较每个贡献集的第一个成员并添加最小的成员,然后重复操作,直到两个贡献集都为空。剩下两个排序集,1-8和9-16。

X X X XX X X X X X XX X X X X X X X×X X X第五步:X X X X X X X X XX X XX X X X X X X X X-X X XX X X X X X X X XX X X X-X X XX X X X X X X X X-X X X×X X X

第5步显示了完整的结果。剩下的两组分类棒(1-8和9-16)使用相同的合并程序合并在一起(比较每组中的第一组,取最小的,重复直到两个堆栈都是空的)。

主题变奏曲

合并主题有很多变体。一些合并排序同时合并两个以上的集合,从三个或更多集合中选择最小的集合。其他技术将大集合分解为小集合,使用另一种针对小集合优化的技术对这些小集合进行排序(例如快速排序),然后将这些排序的片段合并在一起。

就个人而言,我发现合并排序不仅是了解如何为排序的有用工具编程,但我也用它来分类房子周围的物品,例如配方s和甲板扑克牌,其中有大量项目,使用其他技术很难。

登录登记在这里写点什么或联系作者。