考虑到机器只有 96 字节的可用内存,我需要模拟一个外部排序算法。我正在使用如下所示的 32 字节结构:
typedef struct {
char usedmemory[31];
char key;
}Register32;
我已经将一个大的 tobesorted.txt 文件拆分为 3 个 Register32 二进制文件。例如:
I N T E R C A L A C A O B A L A N C E A D A
分为8个文件,内部排序,从file0.bin到file7.bin,包含31个字节的垃圾,1个字节是用于始终对寄存器进行排序的键。
file0.bin containing INT
file1.bin containing CER
file2.bin containing AAL
file3.bin containing ACO
file4.bin containing ABL
file5.bin containing ACN
file6.bin containing ADE
file7.bin containing A
我的任务是在任何给定时间将这些文件中的 2、3 或 4 个“合并”到退出文件中,并继续合并它们,直到我把初始单词全部整理出来。示例:将 file0 与 file1 合并将在退出文件中输出 CEINRT。当然,合并功能应该概括为一次读取每个排序键并合并到退出文件中,而不管文件输入大小如何。我的 Merge 函数接收一个文件数组,该数组可以包含 2、3 或 4 个文件(函数未知)、所提及数组的最低索引、较高索引和退出文件。它看起来像这样:
void MergeFunction(TypeFile* entry, int lowerindex,int higherindex, TypeFile exitfile){
int i, j, count = 0;
}
TypeFile 只是一个typedef FILE* TypeFile;
.
我知道如果我需要模拟内存限制,我应该一次比较每个寄存器的键,然后将最低值写入 exitfile,但我无法让自己想办法做到这一点。循环约束和输入长度为 6 个或更多关键字符的情况正在融化我的大脑。最后,我只想让最初的 tobesorted.txt 完全排序,一次将 2、3 或 4 个文件合并成一个更大的文件,然后继续下一个。这已经实现了,我只需要实现 Merge 功能。对不起,如果我让自己难以理解,英语不是我的母语。感谢你们能给予的任何帮助。