【问题标题】:Confusion about the combine step in Merge Sort Code对合并排序代码中的合并步骤感到困惑
【发布时间】:2015-02-25 20:57:21
【问题描述】:

我有一个关于数组上的合并排序如何工作的问题。 我理解“划分”步骤,它将输入数组划分为 1 长度的元素。但是,当谈到“合并”部分(组合步骤)时,我感到困惑。 例如,给定输入 3 5 1 8 2,除法过程将产生 5 个元素:3、5、1、8、2。我只知道合并函数会将它们合并为 3 5, 1 8, 2,但是它如何继续合并 3 5 和 1 8 ? “组合”部分是否涉及递归?

【问题讨论】:

  • 请问,您指的是什么代码?
  • 您要查找的递归在第 42 行。
  • 不知道为什么投反对票和不屑一顾的 cmets。这是标准算法教科书(或编码面试)中经常以伪代码提出和回答的问题,从问题中可以清楚地看出他们在问什么(对于任何知道归并排序的人,CS 人员都会知道)。这不是写得最好的问题,但可以通过编辑来改进它,就是这样!

标签: algorithm sorting mergesort


【解决方案1】:

这个动画应该可以帮到你。

http://en.wikipedia.org/wiki/File:Merge-sort-example-300px.gif

流程是这样的:

3 5 1 8 2

3、5、1、8、2

3 5 , 1 2 8

1 2 3 5 8

  1. 从 n 个输入项的未排序列表 I 开始。
  2. 将 I 分成两半 I1 和 I2,具有天花板 (n/2) 和地板 (n/2) 项。
  3. 对 I1 进行递归排序,生成排序后的列表 S1。
  4. 递归地对 I2 进行排序,生成排序后的列表 S2。
  5. 将 S1 和 S2 合并为一个排序列表 S。

在每次迭代中,从两个输入列表中选择具有最小键的项目,并将其附加到输出列表中。由于两个输入列表都已排序,因此只有两项要 测试,所以每次迭代都需要固定的时间。

【讨论】:

    【解决方案2】:

    当两个递归排序例程返回时,您可以放心地假设它们已经对它们的部分进行了排序。合并步骤将这两个排序的子数组组合在一起。如果输入是3 5 1 8 2,第一个递归调用对前半部分排序并产生3 5,第二个递归调用对后半部分排序并产生1 2 8

    您询问的合并步骤通过重复选择两个子数组的两个第一个元素中的最小值并将其添加到结果中,将这两个排序的一半合并为一个,如此动画所示:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-25
      • 2016-04-02
      • 1970-01-01
      • 2016-02-01
      • 1970-01-01
      • 2010-10-17
      • 2014-12-20
      • 2023-01-14
      相关资源
      最近更新 更多