【数据结构_C语言】归并排序—文件类型

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

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-23 00:24:02       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-23 00:24:02       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-23 00:24:02       45 阅读
  4. Python语言-面向对象

    2024-07-23 00:24:02       55 阅读

热门阅读

  1. 2024.7.20-22学习日报

    2024-07-23 00:24:02       10 阅读
  2. Linux-查看dd命令进度

    2024-07-23 00:24:02       15 阅读
  3. 【Android Framewrok】Handler源码解析

    2024-07-23 00:24:02       14 阅读
  4. PCI总线域与处理器域

    2024-07-23 00:24:02       13 阅读
  5. 代码随想录 day 20 二叉树

    2024-07-23 00:24:02       16 阅读
  6. 学懂C语言系列(二):C程序结构

    2024-07-23 00:24:02       19 阅读
  7. StringBuilder类

    2024-07-23 00:24:02       12 阅读
  8. thinkphp6连接kingbase数据库

    2024-07-23 00:24:02       11 阅读
  9. 压缩Mojo模型:轻装上阵的机器学习模型

    2024-07-23 00:24:02       15 阅读
  10. C++11 智能指针之shared_from_this

    2024-07-23 00:24:02       16 阅读