外排序之文件归并排序实现

1. 外排序

外排序(External sorting)是指能够处理极⼤量数据的排序算法。通常来说,外排序处理的数据不能 ⼀次装⼊内存,只能放在读写较慢的外存储器(通常是硬盘)上。外排序通常采⽤的是⼀种“排序-归并”的策略。在排序阶段,先读⼊能放在内存中的数据量,将其排序输出到⼀个临时⽂件,依此进⾏,将待排序数据组织为多个有序的临时⽂件。然后在归并阶段将这些临时⽂件组合为⼀个⼤的有序⽂件,也即排序结果。

跟外排序对应的就是内排序,之前小编讲的常⻅的排序,都是内排序,他们排序思想适应的是数据在内存中,⽀持随机访问。归并排序的思想不需要随机访问数据,只需要依次按序列读取数据,所以归并排序既是⼀个内排序,也是⼀个外排序。

2.创建随机数据文件

创建N个随机数,写到文件中,这里可以将N定义大一点,说明有大量数据。

void CreateData()
{int N = 100000;srand(time(0));const char* file = "data.txt";FILE* fin = fopen(file, "w");if (fin == NULL){perror("fopen fail");exit(-1);}for (int i = 0; i < N; i++){int x = rand() + i;fprintf(fin,"%d\n", x);}fclose(fin);
}

3.文件归并排序思路

1. 读取n个值排序后写到file1,再读取n个值排序后写到file2。

2. file1和file2利⽤归并排序的思想,依次读取⽐较,取⼩的尾插到mfile,mfile归并为⼀个有序⽂件。

3. 将file1和file2删掉,mfile重命名为file1。

4. 再次读取n个数据排序后写到file2。

5. 继续⾛file1和file2归并,重复步骤2,直到⽂件中⽆法读出数据。最后归并出的有序数据放到了 file1中。

这里用到两个函数,remove是将文件移除,rename是将传入的第1个参数的文件名更改为传入的第2个参数的文件名。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>void CreateData()
{int N = 100000;srand(time(0));const char* file = "data.txt";FILE* fin = fopen(file, "w");if (fin == NULL){perror("fopen fail");exit(-1);}for (int i = 0; i < N; i++){int x = rand() + i;fprintf(fin,"%d\n", x);}fclose(fin);
}int cmp(const void* a, const void* b)
{return (*(int*)a - *(int*)b);
}int ReadNNumSortToFile(FILE* fout, int n, const char* file1)
{int x = 0;int* a = (int*)malloc(sizeof(int) * n);if (a == NULL){perror("malloc fail");return 0;}int j = 0;for (int i = 0; i < n; i++){if (fscanf(fout, "%d", &x) == EOF)break;a[j++] = x;}if (j == 0){free(a);return 0;}qsort(a, j, sizeof(int), cmp);FILE* fin = fopen(file1, "w");if (fin == NULL){free(a);perror("fopen fail");return 0;}for (int i = 0; i < j; i++){fprintf(fin, "%d\n", a[i]);}free(a);fclose(fin);return j;}void MergeFile(const char*file1, const char* file2, const char* mfile)
{FILE* fout1 = fopen(file1, "r");if (fout1 == NULL){perror("fopen fail");return;}FILE* fout2 = fopen(file2, "r");if (fout2 == NULL){perror("fopen fail");return;}FILE* mfin = fopen(mfile, "w");if (mfin == NULL){perror("fopen fail");return;}int x1 = 0;int x2 = 0;int ret1 = fscanf(fout1, "%d",&x1);int ret2 = fscanf(fout2, "%d",&x2);while (ret1 != EOF && ret2 != EOF){if (x1 < x2){fprintf(mfin, "%d\n", x1);ret1 = fscanf(fout1, "%d", &x1);}else{fprintf(mfin, "%d\n", x2);ret2 = fscanf(fout2, "%d", &x2);}while (ret1 != EOF){fprintf(mfin, "%d\n", x1);ret1 = fscanf(fout1, "%d", &x1);}while (ret2 != EOF){fprintf(mfin, "%d\n", x2);ret2 = fscanf(fout2, "%d", &x2);}}fclose(fout1);fclose(fout2);fclose(mfin);
}int main()
{	CreateData();const char* file1 = "file1.txt";const char* file2 = "file2.txt";const char* mfile = "mfile.txt";FILE* fout = fopen("data.txt", "r");if (fout == NULL){perror("fopen fail");exit(-1);}int m = 10000;ReadNNumSortToFile(fout,m,file1);ReadNNumSortToFile(fout,m,file2);while (1){MergeFile(file1,file2,mfile);remove(file1);remove(file2);rename(mfile, file1);int n = 0;if ((n =ReadNNumSortToFile(fout, m, file2))==0){break;}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/9334.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

校园官网练习---web

HTML&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>西安工商学院</title><…

JAVA-08-继承

继承 父类&#xff1a;被继承的类 子类&#xff1a;继承父类的类&#xff0c;可以访问父类的公有和保护成员。 extends:使用 extends 关键字来表示一个类继承另一个类。 方法重写:子类可以重写父类的方法&#xff0c;以提供特定的实现。重写的方法必须与父类中的方法具有相…

Trimble X12三维激光扫描仪正在改变游戏规则【上海沪敖3D】

Trimble X12 三维激光扫描仪凭借清晰、纯净的点云数据和亚毫米级的精度正在改变游戏规则。今天的案例我们将与您分享&#xff0c;X12是如何帮助专业测量咨询公司OR3D完成的一个模拟受损平转桥运动的项目。 由于习惯于以微米为单位工作&#xff0c;专业测量机构OR3D是一家要求…

SpringBoot框架下的资产管理创新

4系统概要设计 4.1概述 系统设计原则 以技术先进、系统实用、结构合理、产品主流、低成本、低维护量作为基本建设原则&#xff0c;规划系统的整体构架. 先进性&#xff1a; 在产品设计上&#xff0c;整个系统软硬件设备的设计符合高新技术的潮流&#xff0c;媒体数字化、压缩、…

统信UOS开发环境支持Perl

UOS凭借广泛的编程语言支持,为开发者构建了一个高效灵活的开发环境,无需担心环境兼容性问题。 文章目录 一、环境部署1. Perl开发环境安装2. Perl开发环境配置环境变量配置模块管理器编辑器集成调试工具二、代码示例文件处理Web开发三、常见问题1. 依赖管理问题2. 性能问题3.…

qt QClipboard详解

1、概述 QClipboard是Qt框架中的一个类&#xff0c;它提供了对窗口系统剪贴板的访问能力。剪贴板是一个临时存储区域&#xff0c;通常用于在应用程序之间传递文本、图像和其他数据。QClipboard通过统一的接口来操作剪贴板内容&#xff0c;使得开发者能够方便地实现剪切、复制和…

机器学习在时间序列预测中的应用与实现——以电力负荷预测为例(附代码)

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 随着数据采集技术的发展&#xff0c;时间序列数据在各个领域中的应用越来越广泛。时间序列预测旨在基于过去的时间数据来…

强大的吾店云建站平台介绍

经过多年在WordPress建站领域的摸索和探索&#xff0c;能轻松创建和管理各种类型网站的平台 – 吾店云建站平台诞生了。 应该说这是一个艰苦卓绝的过程&#xff0c;在中国创建一个能轻松创建和使用WordPress网站的平台并不容易&#xff0c;最主要是网络环境和托管软件的限制。…

猿创征文|Inscode桌面IDE:打造高效开发新体验

猿创征文&#xff5c;Inscode桌面IDE&#xff1a;打造高效开发新体验 引言 在当今快速发展的软件开发领域&#xff0c;一个高效、易用的集成开发环境&#xff08;IDE&#xff09;是每个开发者必不可少的工具。Inscode 桌面 IDE 作为一款新兴的开发工具&#xff0c;凭借其强大…

Java多线程并发安全问题

多线程并发安全问题 概念 当多个线程并发操作同一临界资源,由于线程切换时机不确定,导致操作临界资源的顺序出现混乱严重时可能导致系统瘫痪. 临界资源:操作该资源的全过程同时只能被单个线程完成. 例 当beans为1时&#xff0c;若两个线程同时调用getBean方法&#xff0c;t…

电脑管家实时监控软件下载 | 六款知名又实用的电脑监控软件推荐!(珍藏篇)

在当今的商业环境&#xff0c;企业对于员工在工作期间的行为监控需求越来越强烈。 尤其是在网络化和信息化程度不断提高的今天&#xff0c;电脑管家实时监控软件是企业管理员工工作行为、提高工作效率、防止信息泄露的重要工具。 本文&#xff0c;将为您推荐六款知名又实用的电…

机器学习—训练细节

首先回忆如何训练一个逻辑回归模型&#xff0c;建立一个Logistic回归模型是&#xff1a;你将指定如何计算输出给定输入特征x和参数w和b&#xff0c;在逻辑回归函数预测f(x)g&#xff0c;它是应用于w*xb的Z状结肠函数&#xff0c;所以如果znp.dot(w,x)b&#xff0c;f_x1/(1np.ex…

图片翻译之尺码表批量翻译

最近在为客户解决问题的过程中&#xff0c;小编发现了一个令人惊叹的应用场景——电商平台可以通过OpenAI 批量翻译图片格式的尺码表&#xff0c;且翻译内容能够准确地呈现为多种语言&#xff01; 这不仅让我感叹 AI 效率的强大&#xff0c;也让我对电商行业的竞争压力感到震撼…

深入了解决策树:机器学习中的经典算法

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

C语言实现数据结构之堆

文章目录 堆一. 树概念及结构1. 树的概念2. 树的相关概念3. 树的表示4. 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 二. 二叉树概念及结构1. 概念2. 特殊的二叉树3. 二叉树的性质4. 二叉树的存储结构 三. 二叉树的顺序结构及实现1. 二叉树的顺序结构2.…

如何关闭 Ubuntu22.04 LTS 的更新提醒

引言 众所周知&#xff0c;Ubuntu 的软件更新和版本更新提醒是又多又烦&#xff0c;如果不小心更新到了最新的 Ubuntu 还可能面临各种各样的问题&#xff0c;这里提供一个解决方法 步骤 首先按照下面步骤打开 Software & Updates 然后按照下面步骤依次点击 最后关闭即可…

CS61b part5

8.1 The Desire for Generality 今天我们将会讨论一个全新的主题&#xff0c;称为继承。为了铺垫&#xff0c;让我们考虑在过去几节课中构建的SList类和AList类。我们看到它们实际上具有完全相同的操作&#xff0c;它们都允许我们添加元素、获取元素、移除元素以及获取大小&am…

隆盛策略正规股票杠杠交易市场A股,盘中突变…

突然跌了。 查查配分析A股市场今天大幅高开,上证指数一度重返3500点之上,临近午盘,该指数翻绿。TMT赛道掀起涨停潮,成为上午A股市场最大亮点之一。 另外,多只近期强势股继续走强,有股票在短短9个交易日的时间股价自低位涨了约3倍。 隆盛策略以其专业的服务和较低的管理费用在…

学生公寓人走断电控制系统的设计要求

石家庄光大远通电气有限公司学生公寓人走断电系统技术背景用电器待机能耗往往是一种不易被发现的“隐藏的浪费”&#xff0c;如果将一户家庭的空调、洗衣机、电视、微波炉、电饭煲五类电器进行计算&#xff0c;待机功率在12W到15W&#xff0c;待机能耗0.2度到0.33度电。每年能耗…

解决yum命令报错“Could not resolve host: mirrorlist.centos.org

这个主要是yum源出了问题或者服务器网络有问题&#xff0c;检查网络排除网络问题后&#xff0c;可更换源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.k wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.huaweicloud.com/repository…