2017-09-01 78 views
-1

我想为我的DBMS项目实现外部合并排序。我有一个3个文件,每个20页,我的缓冲区大小是20页。 这些我现在已经排序了。所以20页的三个文件都被排序。现在,在合并时,我需要将每个文件(6x3 = 18页)和1页的6页写入排序后的输出。并且这必须完成4次才能完整整理文件。 但我很难合并所有这些文件?任何步骤如何执行3个文件的合并,确保每个页面都带入缓冲区大小。任何递归函数? 所有的文件内容存储在数组a [文件编号] [pageno]格式 例如a [1] [20] = 5意味着我有在文件1的页面20号数据5。 假设文件的页面保存一个整数。外部合并排序

回答

1

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

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

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