文章目录
- 1.排序定义
- 2. 代码实现
1.排序定义
内排序:数据量相对少一些,可以放到内存中排序。
外排序:数据量较大,内存中放不下,数据放到磁盘文件中,需要排序。
归并排序:
2. 代码实现
void _MergeFile(const char* file1, const char* file2, const char* mfile)
{FILE* fout1 = fopen(file1, "r");if (fout1 == NULL){printf("打开文件失败\n");exit(-1);}FILE* fout2 = fopen(file2, "r");if (fout2 == NULL){printf("打开文件失败\n");exit(-1);}FILE* fin = fopen(mfile, "w");if (fin == NULL){printf("打开文件失败\n");exit(-1);}int num1, num2;int ret1 = fscanf(fout1, "%d\n", &num1);int ret2 = fscanf(fout2, "%d\n", &num2);while (ret1 != EOF && ret2 != EOF){if (num1 < num2){fprintf(fin, "%d\n", num1);ret1 = fscanf(fout1, "%d\n", &num1);}else{fprintf(fin, "%d\n", num2);ret2 = fscanf(fout2, "%d\n", &num2);}}while (ret1 != EOF){fprintf(fin, "%d\n", num1);ret1 = fscanf(fout1, "%d\n", &num1);}while (ret2 != EOF){fprintf(fin, "%d\n", num2);ret2 = fscanf(fout2, "%d\n", &num2);}fclose(fout1);fclose(fout2);fclose(fin);
}void MergeSortFile(const char* file)
{FILE* fout = fopen(file, "r");if (fout == NULL){printf("打开文件失败\n");exit(-1);}// 分割成一段一段数据,内存排序后写到,小文件,int n = 10;int a[10];int i = 0;int num = 0;char subfile[20];int filei = 1;memset(a, 0, sizeof(int)*n);while (fscanf(fout,"%d\n", &num) != EOF){if (i < n-1){a[i++] = num;}else{a[i] = num;QuickSort(a, 0, n - 1);sprintf(subfile, "%d", filei++);FILE* fin = fopen(subfile, "w");if (fin == NULL){printf("打开文件失败\n");exit(-1);}for (int i = 0; i < n; i++){fprintf(fin,"%d\n", a[i]);}fclose(fin);i = 0;memset(a, 0, sizeof(int)*n);}}// 利用互相归并到文件,实现整体有序char mfile[100] = "12";char file1[100] = "1";char file2[100] = "2";for (int i = 2; i <= n; ++i){// 读取file1和file2,进行归并出mfile_MergeFile(file1, file2, mfile);strcpy(file1, mfile);sprintf(file2, "%d", i+1);sprintf(mfile, "%s%d", mfile, i+1);}fclose(fout);
}int main()
{MergeSortFile("Sort.txt");return 0;
}