两两顺序归并法将文件归并成一个有序文件,用c语言编程
时间: 2024-03-19 13:44:40 浏览: 25
两两顺序归并法是外部排序中的一种,用于将多个有序文件归并成一个有序文件。下面是用C语言实现两两顺序归并法的代码:
```
#include <stdio.h>
#include <stdlib.h>
void mergeFiles(FILE* f1, FILE* f2, FILE* output) {
int num1, num2;
fread(&num1, sizeof(int), 1, f1);
fread(&num2, sizeof(int), 1, f2);
while (!feof(f1) && !feof(f2)) {
if (num1 < num2) {
fwrite(&num1, sizeof(int), 1, output);
fread(&num1, sizeof(int), 1, f1);
} else {
fwrite(&num2, sizeof(int), 1, output);
fread(&num2, sizeof(int), 1, f2);
}
}
while (!feof(f1)) {
fwrite(&num1, sizeof(int), 1, output);
fread(&num1, sizeof(int), 1, f1);
}
while (!feof(f2)) {
fwrite(&num2, sizeof(int), 1, output);
fread(&num2, sizeof(int), 1, f2);
}
}
void mergeSort(char* input_file, char* output_file, int num_files) {
FILE* files[num_files];
for (int i = 0; i < num_files; i++) {
char filename[20];
sprintf(filename, "file%d.dat", i);
files[i] = fopen(filename, "rb");
}
FILE* output = fopen(output_file, "wb");
while (num_files > 1) {
for (int i = 0; i < num_files / 2; i++) {
FILE* f1 = files[i * 2];
FILE* f2 = files[i * 2 + 1];
char filename[20];
sprintf(filename, "temp%d.dat", i);
FILE* temp = fopen(filename, "wb");
mergeFiles(f1, f2, temp);
fclose(f1);
fclose(f2);
fclose(temp);
files[i * 2] = fopen(filename, "rb");
files[i * 2 + 1] = NULL;
}
if (num_files % 2 == 1) {
files[num_files / 2] = files[num_files - 1];
files[num_files - 1] = NULL;
num_files = num_files / 2 + 1;
} else {
num_files = num_files / 2;
}
}
int num;
fread(&num, sizeof(int), 1, files[0]);
while (!feof(files[0])) {
fwrite(&num, sizeof(int), 1, output);
fread(&num, sizeof(int), 1, files[0]);
}
fclose(output);
fclose(files[0]);
}
int main() {
int arr1[] = { 2, 4, 6, 8, 10 };
int arr2[] = { 1, 3, 5, 7, 9 };
int arr3[] = { 11, 13, 15, 17, 19 };
int arr4[] = { 12, 14, 16, 18, 20 };
int arr_size = sizeof(arr1) / sizeof(arr1[0]);
FILE* f1 = fopen("file0.dat", "wb");
fwrite(arr1, sizeof(int), arr_size, f1);
fclose(f1);
FILE* f2 = fopen("file1.dat", "wb");
fwrite(arr2, sizeof(int), arr_size, f2);
fclose(f2);
FILE* f3 = fopen("file2.dat", "wb");
fwrite(arr3, sizeof(int), arr_size, f3);
fclose(f3);
FILE* f4 = fopen("file3.dat", "wb");
fwrite(arr4, sizeof(int), arr_size, f4);
fclose(f4);
mergeSort("file*.dat", "output.dat", 4);
FILE* output = fopen("output.dat", "rb");
int num;
while (!feof(output)) {
fread(&num, sizeof(int), 1, output);
printf("%d ", num);
}
fclose(output);
return 0;
}
```
在上面的代码中,我们首先将四个有序数组写入到四个文件中,然后调用`mergeSort`函数将这些文件归并成一个有序文件。在`mergeSort`函数中,我们首先打开所有的输入文件和输出文件,然后使用循环将所有的文件两两归并,将结果写入到一个临时文件中。归并后的文件数目减半,重复上述步骤,直到只剩下一个文件为止。最后,将剩余的有序文件中的数字依次写入到输出文件中。
需要注意的是,上面的代码中使用了文件名通配符`file*.dat`来打开所有的输入文件,需要确保所有的输入文件名都以`file`开头,并且后面的数字是连续的。