【问题标题】:3 partition mergesort3 分区归并排序
【发布时间】:2012-05-19 18:34:54
【问题描述】:

我的教授指派我的班级在具有 3 部分分区和合并的数组中实现合并排序。

这正是教授提出的问题。问题是我没有发现 3 路归并排序之类的东西我只知道 3 路快速排序所以我认为他可能打算取一个数组,将其分成 3 个部分,然后将这 3 个部分合并在一起,我m 通过将前 2 个部分合并排序,然后将合并的部分与第 3 个部分合并排序来做到这一点。

我的想法是否正确,我做的是否正确(已经实现,但我没有发布代码,因为它与我的问题没有任何关系)还是我理解错误并且有类似 3 的内容我不知道的方式合并排序。

教授倾向于给我们分配与我们尚未学过的东西有关的作业,这就是为什么我对此持怀疑态度,并且我尽可能多地在 Google 等中查看。

【问题讨论】:

    标签: arrays quicksort mergesort


    【解决方案1】:

    将三个子数组合并排序后,您可以一次将它们合并在一起:比较所有三个子数组的第一个元素并将最小的元素放入组合数组中,然后从数组中取出下一个元素再次进行比较,直到所有子数组元素都被计算在内。

    确保您处理数组中只有两个元素的情况(因此您不能将其分成三个非空部分)。另外,在上一段中,合并时一个数组将在其他数组之前为空,因此您也需要考虑这一点。

    【讨论】:

    • 我实际上对这三个中的每一个都使用了 Arrays.sort,然后按照我所说的将它们成对合并。至于你告诉我做什么,我想我可以一次完成,但这对我来说似乎太复杂了,这就是为什么我分两步完成,而第一步返回前两部分的合并数组。至于我的主要问题,我是否真的做对了,或者有没有办法实现与我描述的行为无关的 3 路归并排序?
    • 如果您正在调用 Arrays.sort() 进行排序,那么您没有进行合并排序(除非该调用正在执行此操作,这不能保证)。正如您在第二段中描述的那样,合并排序是一个递归函数(递归调用自身以对较小的数组进行排序)。当然,您可以一次合并 2 个数组,但如果一次合并所有三个数组,您会获得一些性能优势
    • 所以你说,在我拥有 3 个子数组之后,我应该单独对它们中的每一个进行合并排序,作为最后一步,我应该同时对 3 个部分进行合并排序,或者他可能会问类似的问题这个stackoverflow.com/questions/2224492/mergesort-beginner-question。顺便说一句,他还没有回答
    • 是的,我描述的和你提供的链接一样
    • 我实际上正在尝试查找有关这种合并排序的更多资源,但我似乎找不到任何关于它的信息,例如,您是否有可能知道在 Google 中寻找什么。谷歌搜索 3-way 合并排序或 3 个分区的合并排序绝对不会提供任何东西
    【解决方案2】:

    它被称为三部分合并排序,因为它就是这样做的。 看看http://mathbits.com/MathBits/CompSci/Arrays/Merge.htm

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-17
      • 2014-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多