外排序 归并排序 超级详细 拜托点赞

外排序 就是比如说你在文件中你有很大的数组 你无法一起加载到内存中 只能一部分一部分的加载带内存中,然后对它进行排序,他的思想就是 我先分为几份,然后对每一份先排序,排完序后我再进行归并排序,具体步骤程序都标注明白了 。请看程序注释就可以 拿过来直接就可以跑

另外 快速排序在这里就不给了 上一篇已经给了


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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值