Мне нужно смоделировать внешний алгоритм сортировки, учитывая, что на машине доступно только 96 байт памяти. Я использую 32-байтовые структуры, которые выглядят так:
typedef struct {
char usedmemory[31];
char key;
}Register32;
Я уже разбил большой файл tobesorted.txt на три двоичных файла 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 из этих файлов в выходной файл в любой момент времени и продолжать объединять их, пока я не разберусь с начальным словом. Пример: объединение файла0 с файлом1 выведет C E I N R T в выходной файл. Конечно, функция слияния должна быть обобщена, чтобы читать каждый ключ сортировки за раз и объединяться в выходной файл независимо от размера входного файла. Функция My Merge получает массив файлов, который может содержать 2, 3 или 4 файла (функция не знает), самый низкий индекс упомянутого массива, более высокий индекс и выходной файл. Это выглядит так:
void MergeFunction(TypeFile* entry, int lowerindex,int higherindex, TypeFile exitfile){
int i, j, count = 0;
}
TypeFile является только typedef FILE* TypeFile;
.
Я знаю, что должен сравнивать каждый ключ регистра за раз, а затем записывать самый низкий ключ в файл выхода, если мне нужно смоделировать ограничение памяти, но я не могу заставить себя придумать, как это сделать. Ограничения цикла и случаи, когда входные данные состоят из 6 или более ключевых символов, плавят мой мозг. В конце концов, я просто хочу полностью отсортировать этот первоначальный tobesorted.txt, объединяя 2, 3 или 4 файла за раз в один больший и переходя к следующему. Это уже реализовано, мне просто нужно реализовать функцию Merge. Извините, если я сделал себя слишком трудным для понимания, английский не мой родной язык. Цените любую помощь, которую вы, ребята, можете дать.