外部合并排序

时间:2017-09-01 16:27:55

标签: database sorting merge

我正在尝试为我的DBMS项目实现外部合并排序。我有一个3个文件,每个有20页,我的缓冲区大小是20页。 我现在已经整理了这些。因此,对20页的所有三个文件进行排序。现在在合并时我需要带6页每个文件(6x3 = 18页)和1页来编写排序输出。这必须完成4次才能使整个文件完整排序。 但我发现难以合并所有这些文件?任何步骤如何执行3个文件的合并,确保每个页面都有缓冲区大小。任何递归函数? 所有文件内容都以[fileno] [pageno]格式存储在数组中 例如a [1] [20] = 5表示我在文件1的页面20中有5的数据。 假设文件的页面包含整数。

1 个答案:

答案 0 :(得分:1)

假设你进行3路合并,那就是3路输入和1路输出,而且只需要完成一次。将缓冲区分为4个部分,每个部分5页。首先阅读3个文件的前5页,每个页面都放在5页缓冲区中。通过比较3个缓冲区中每个缓冲区中的第一条记录并将最小值移动到输出缓冲区来启动3路合并。填充输出缓冲区(5页)时,将其写出并继续。当清空输入缓冲区时,请在接下来的5页中读取该文件。

当到达三个输入文件之一的末尾时,代码切换到双向合并。要简化代码,请将文件相关参数复制到文件0和文件1的参数中。如果文件2先变为空,则不需要执行任何操作。如果文件1首先变为空,则将文件2参数复制到文件1.如果文件0首先变为空,则将文件1参数复制到文件0,然后将文件2参数复制到文件1。然后使用文件0和文件1进行2路合并。

当两个输入文件的末尾到达时,代码切换到仅复制剩余文件。同样,如果文件0首先变为空,则将文件1参数复制到文件0,以便复制代码始终与文件0一起使用。