【问题标题】:two way merge sort for 2 file c++2个文件c ++的两种方式合并排序
【发布时间】:2018-04-06 13:29:51
【问题描述】:

我被要求对两个文件(记录文件)应用双向合并排序, 该算法解释了如下步骤:

排序阶段 1)要排序的文件上的记录被分成几组。 每个组称为一次运行,每次运行都适合主内存。 2) 每次运行都会应用内部排序,3) 排序后的运行结果会分布到两个外部文件中。

合并排序: 1) 在排序阶段创建的每个外部文件的一次运行合并成更大的排序记录运行。 2)结果存储在第三个文件中。 3)数据被分配回前两个文件中,并继续合并,直到所有记录都在一个大运行中。

我只能申请Sort Phase,所以当前文件是: (假设运行仅包含 3 个键)

文件 1: 50 95 110 | 40 120 153 | 22 80 140

文件 2: 10 36 100 | 60 70 130

这是合并阶段的步骤 所以如果我在理论上解决它会执行以下操作:

合并阶段:

第一步:

文件 3: 10 36 50 95 100 110 | 40 60 70 120 130 153 | 22 80 140

文件 1: 10 36 50 95 100 100 | 22 80 140

文件 2: 40 60 70 120 130 153

第二步:

文件 3: 10 36 40 50 60 70 95 100 110 120 130 135 | 22 80 140

文件 1: 10 36 40 50 60 70 95 100 110 120 130 135

文件 2: 22 80 140

第 3 步:

文件 3: 10 22 36 40 50 60 70 80 95 100 110 120 130 135 140

一次运行停止排序完成

现在我需要应用合并阶段,以便每个文件中的每个键相互比较并将较小的输出到文件 3,然后在步骤 2 中将文件 3 重新分配到两个文件中,然后合并和排序直到运行一个排序

我如何在 c++ 中应用这种算法,我有点困惑如何确定每一步中每次运行的大小。

【问题讨论】:

  • 你期望“文件 3”的内容是什么?
  • 我用照片更新了帖子。
  • 我想我不明白排序标准。
  • 取决于块的大小
  • 请编辑您的问题,将算法和步骤都包含为文本,而不是图像链接。这将使您的帖子更加清晰。

标签: c++ sorting merge mergesort


【解决方案1】:

正如 Amdt Jonasson 所说,程序需要跟踪每个文件的运行大小和数据结尾。在您的示例中,初始运行大小似乎是 3 个元素的固定运行大小。如您的步骤所示,两个大小为 3 的运行的合并将导致一次大小为 6 的运行。在这种情况下,只需要跟踪单个运行大小实例和每个文件中数据的结尾。

如果排序是稳定的排序(原始顺序保留在相等的键上),并且运行大小是可变的,则需要每个文件的运行计数数组,或者某种方式来表示结束在文件(例如文本文件)中运行,使用特殊字符序列作为运行结束指示符。

如果不要求排序是稳定的,则可以使用乱序(较大的键值后较小的键值)来指示运行结束。这里的风险是,如果运行恰好是有序的,那么两次或多次运行似乎是一次运行,这将失去稳定性并使文件上的运行计数不平衡。

这是使用 3 个文件的双向合并排序。如果您使用第 4 个文件,则每次运行合并可以在 2 个输出文件之间交替,无需在每次合并后拆分运行。

对 3 个文件进行 2 路合并排序的另一种方法是多相合并排序,但它很复杂,可能超出了对类分配的预期,而且更多的是在基于磁带的排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    • 2019-04-29
    • 2016-04-19
    相关资源
    最近更新 更多