当前位置: 首页 > 知识库问答 >
问题:

双向合并排序和合并排序

阴凯歌
2023-03-14

双向合并排序与递归合并排序有何不同?

假设在合并排序中有5个数字需要排序8,9,1,6,4,我们按如下步骤1进行划分:{8,9,1}{6,4}

步骤2:{8,9}{1}{6}{4}

步骤3:{8}{9}{1}{6}{4}

现在合并

步骤4:{8,9}{1}{4,6}

步骤5:{1,8,9}{4,6}

第六步:{1,4,6,8,9}

但在双向合并排序中,我们将数组分为两个元素(但根据维基百科,在合并每两个元素之前,需要对每个部分进行排序)。https://en.wikipedia.org/wiki/K-way_merge_algorithm)那么,它也从单个元素开始,并将它们合并,对吗?数组的步骤:8,9,1,6,4

步骤1:{8,9}{1,6}{4}[即奇数元素最终合并]

步骤2:{1,6,8,9}。{4}

步骤3:{1,4,6,8,9}

所以,这里减少了步数。那么它的算法是什么?双向合并排序合并排序比合并排序更有效吗?

共有1个答案

陈泰宁
2023-03-14

2路合并排序合并排序比合并排序更有效吗?

迭代双向合并排序的另一个名称是自底向上合并排序,而递归合并排序的另一个名称是自顶向下合并排序。

通常,优化的自底向上合并排序比优化的自顶向下合并排序效率略高。自顶向下合并排序对由数组递归“拆分”生成的索引执行O(n)堆栈操作。如果n不是2的幂,则自底向上合并排序执行更多的比较和移动,但它小于自顶向下合并排序的堆栈操作开销。对于大型阵列,差异小于5%。

对于混合插入/合并排序,它对n/m组m个元素使用插入排序,自下而上的合并排序可以调整m以处理n不是2的幂。

自顶向下的合并排序主要用于学习。尽管在性能和堆栈空间方面存在微小差异,但大多数库使用一些自下而上合并排序的变体来实现稳定排序。

 类似资料:
  • 我正在维基百科上阅读关于外部排序的文章,我需要理解为什么两阶段合并比一阶段合并更有效。 Wiki:但是,单次合并有一个限制。随着区块数量的增加,我们将内存分成更多的缓冲区,因此每个缓冲区都较小,因此我们必须进行许多较小的读取,而不是较少的较大读取。 因此,对于100 MB内存中的50 GB的排序,使用单个合并过程是没有效率的:磁盘需要用500个数据块中的每个数据块(我们一次从每个数据块读取100M

  • 本文向大家介绍合并排序,包括了合并排序的使用技巧和注意事项,需要的朋友参考一下 合并排序技术基于分而治之。我们将整个数据集分成较小的部分,然后按排序顺序将它们合并成较大的部分。在最坏情况下它也非常有效,因为该算法在最坏情况下的时间复杂度也较低。 合并排序技术的复杂性 时间复杂度: 所有情况下为O(n log n) 空间复杂度:  O(n) 输入输出 算法 合并(数组,左,中,右) 输入- 数据集数

  • 本文向大家介绍Haskell合并排序,包括了Haskell合并排序的使用技巧和注意事项,需要的朋友参考一下 示例 有序合并两个有序列表 保留重复项: 自顶向下版本: 定义这种方式是为了清楚而非效率。 使用示例: 结果: 自下而上的版本:            

  • 这些是家庭作业问题,但我想了解它们背后的概念,而不仅仅是得到答案。 我知道MergeSort的运行时间是O(nlogn)。似乎合并方法必须运行 n 次(因为它必须合并所有数组,最终会有 n 个数组)。因此,我想我可以推断出 MergeSort() 方法将被称为 logn times。我也认为这是有道理的,因为它正在划分数组,所以它会一直将自己除以 2,所以 logn。 因此,我觉得答案分别是C和A

  • 我知道合并排序算法的基本概念,但是当涉及到通过递归实现它时,我很难理解它是如何工作的。据我所知,合并排序函数将我们当前的数组分成两半,并使用递归我们一直这样做,直到每边只剩下一个元素。 如果我们的数组是{38、27、43、3、9、82、10},那么我们的递归将从使用子数组(原始数组的左侧)调用自身开始,并每次重复该过程,将数组减半并存储最左侧,直到达到1个元素: 然后在我们的第二个子例程中,我们继

  • 我正试图想出一个分而治之的算法来合并j个排序列表和n个元素,但我被卡住了;我不知道如何把这个问题分成更小的子问题。我希望合并算法更高效,如下所示: 合并前两个列表;然后将结果列表与第三个列表合并;然后将结果列表与第四个列表合并,以此类推,该列表取O(j*jn)。