外排序 就是比如说你在文件中你有很大的数组 你无法一起加载到内存中 只能一部分一部分的加载带内存中,然后对它进行排序,他的思想就是 我先分为几份,然后对每一份先排序,排完序后我再进行归并排序,具体步骤程序都标注明白了 。请看程序注释就可以 拿过来直接就可以跑
另外 快速排序在这里就不给了 上一篇已经给了
void _mergefile(const char* file1, const char* file2, const char* mergefile)
{
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(mergefile, "w");
if (fin == NULL)
{
printf("文件打开失败\n");
exit(-1);
}
//读取1 2 文件的数据 然后进行归并排序把他们放入到merfefile文件中
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 (file == NULL)
{
printf("文件打开失败\n");
exit(-1);
}
//打开文件后要读取里面的数据
int num = 0;
int a[10];//把整个文件平分 使每一个小文件先承载10个数据
int i = 0;
int n = 10;
char subfile[20];
int filei = 1;
while (fscanf(fout, "%d\n", &num)!=EOF)
{
if (i < n - 1)
{
a[i] = num;
i++;
}
else
{
a[i] = num; //之前读了9个 现在再加上一个 为10个 不能在上面<n这样会丢失一个数据
//接着对读到的这10个数据先进行快速排序处理
Quicksort(a, 0, n - 1);
//快速排序完要创建一个子文件夹用来保存已经拍好的数组a中的10 个数据
sprintf(subfile, "%d", filei++);
//接着打开这个subfile文件
FILE* fin = fopen(subfile, "w");
//文件打开后将数组中的数据写入文件
for (int j = 0;j < n; j++)
{
fprintf(fin, "%d\n", a[j]);
}
//数据写完后 关闭 文件
fclose(fin);
i = 0;
}
}
//接着用归并排序, 将之前写好的文件一一排序;
char mergefile[100] = "12";
char file1[100] = "1";
char file2[100];
//应该从第二个文件开始 到第n个文件 依次与之前的文件两两归并
for (int i = 2; i <= n; i++)
{
sprintf(file2, "%d", i);
_mergefile(file1, file2, mergefile);
strcpy(file1, mergefile); //将mergefile里面的内容拷贝到file1中
sprintf(mergefile, "%s%d", mergefile, i++);
}
fclose(fout);
}
int main()
{
//srand((unsigned int )time(NULL));
/*insertsort();
shellsort();
heapsort();
bubble_sort();
quicksort();*/
//Mergesort();
//char* file;
mergesortfile("file.txt");
system("pause");
return 0;
}