外部排序之文件归并

概述

外部排序(External Sorting)是一种用于处理无法完全加载到内存中的大量数据的排序技术。由于内存的限制,传统的内存排序算法(如快速排序、归并排序)可能无法处理超大规模的数据集合。因此,需要采用外部排序技术,将数据分割成较小的块,利用磁盘进行排序。

文件归并

概念

文件归并(File Merging)是一种将多个已排序文件合并成一个单一排序文件的过程。这通常用于处理大规模数据集,其中数据已经被分割成多个部分,每部分在内存中排序后存储在磁盘上。

实现思路

(1)读取n个值排序后写入file1,再读取n个值排序后写入file2

(2)file1和file2利用归并排序的思想,依次读取比较,取小的数尾插到mfile,mfile再归并为一个有序文件
在这里插入图片描述
(3)重命名mfile为file1,再次从data中读取n个数据排序后写入file2
(4)重复步骤2、3直到data无法读出数据,得到排序好的文件file1
在这里插入图片描述

代码实现

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
//创建随机数据
void CreateDate()
{int n = 40000;//生成随机数据(自1970年1月1日)srand(time(0));//常量字符指针 用file存储文件名的字符串const char* file = "data.txt";//对file文件进行写操作FILE* fin = fopen(file, "w");if (fin == NULL){perror("fopen error");//打印错误信息return;}//生成n个随机数并写入文件for (int i = 0; i < n; i++){int x = rand() + i;//添加换行符——保持数据完整性,方便读入fscanffprintf(fin, "%d\n", x);}fclose(fin);
}int compare(const void* a, const void* b)
{return (*(int*)a - *(int*)b);
}//传入file的实参,无需每次打开file文件,直接读出n个数据到file1
int ReadNDateSortToFile(FILE* fout,int n,const char* file1)
{//创建空间为n的数组int* a = (int*)malloc(sizeof(int) * n);if (a == NULL){perror("malloc fail");return 0;}int x = 0;//如果遇到文件读取结束,实际读取的数据为j个int j = 0;for (int i = 0; i < n; i++){//从fout读出一个数据赋值给x//如果读不出来说明data中数据读取完成if (fscanf(fout, "%d", &x) == EOF)break;a[j++] = x;}if (j == 0){free(a);return 0;}//内部排序(随意选择一种排序方法)qsort(a, j, sizeof(int), compare);//对file1文件进行写操作FILE* fin = fopen(file1, "w");if (fin == NULL){perror("fopen error");//打印错误信息return 0;}for (int i = 0; i < j; i++){fprintf(fin, "%d\n", a[i]);}free(a);fclose(fin);return j;//返回实际读到的数据个数,没有数据了返回0
}void MergeFile(const char* file1, const char* file2, const char* mfile)
{FILE* fout1 = fopen(file1, "r");if (fout1 == NULL){perror("fopen error");//打印错误信息return;}FILE* fout2 = fopen(file2, "r");if (fout2 == NULL){perror("fopen error");//打印错误信息return;}FILE* mfin = fopen(mfile, "w");if (mfin == NULL){perror("fopen error");//打印错误信息return;}//归并操作int x1 = 0;int x2 = 0;int ret1 = fscanf(fout1, "%d\n", &x1);int ret2 = fscanf(fout2, "%d\n", &x2);while (ret1 != EOF && ret2 != EOF){if (x1 < x2){fprintf(mfin, "%d\n", x1);ret1 = fscanf(fout1, "%d\n", &x1);}else{fprintf(mfin, "%d\n", x2);ret2 = fscanf(fout2, "%d\n", &x2);}}while (ret1 != EOF){fprintf(mfin, "%d\n", x1);ret1 = fscanf(fout1, "%d\n", &x1);}while (ret2 != EOF){fprintf(mfin, "%d\n", x2);ret2 = fscanf(fout2, "%d\n", &x2);}fclose(fout1);fclose(fout2);fclose(mfin);
}int main()
{CreateDate();const char* file1 = "file1.txt";const char* file2 = "file2.txt";const char* mfile = "mfile.txt";//对fout文件进行写操作FILE* fout = fopen("data.txt", "r");if (fout == NULL){perror("fopen error");//打印错误信息return 0;}ReadNDateSortToFile(fout,100,file1);ReadNDateSortToFile(fout, 100, file2);//文件归并while (1){MergeFile(file1, file2, mfile);//删除file1和file2remove(file1);remove(file2);//重命名mfile为file1rename(mfile, file1);//读入100个数据排序后到file2if (ReadNDateSortToFile(fout, 100, file2) == 0)break;}return 0;
}

文件归并过程

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM面试(一)什么是虚拟机?什么是class文件?

什么是java虚拟机&#xff1f; 如果通俗点来讲&#xff0c;我们在电脑上一行行敲出来的代码&#xff0c;电脑本身是不认识的&#xff0c;最终是要转成电脑可以运行的101001这种字节。 但是这些我们又不可能手动来转换&#xff0c;所以呢&#xff0c;就需要一个工具&#xff0…

零差云控电机ubuntu+IGH调试记录

一、上位机 Twincat3安装&#xff1a;https://blog.csdn.net/LclLsh/article/details/122863502 Twincat3设置实时网卡&#xff1a;https://zhuanlan.zhihu.com/p/217715531 Twincat3设置独立cpu&#xff1a;https://blog.csdn.net/weixin_44555503/article/details/108711912…

PyCharm中python语法要求——消去提示波浪线

PyCharm中python语法要求——消去提示波浪线 关闭代码规范检查 在Setting里边搜索pep&#xff0c;取消勾选pep8 coding style violation 问题产生 解决问题 按照下图操作&#xff0c;也可直接CtrlAlts弹出设置页面 在 Settings 中 &#xff1a; Editor > Color Sheame >…

Nginx: TCP建立连接的优化和启用Fast Open功能

TCP 建立连接优化 在三次握手中&#xff0c;相关TCP的内核参数可优化这一过程 net.ipv4.tcp_syn_retries 6net.ipv4.tcp_synack_retries 5net.ipv4.tcp_syncookies 0net.ipv4.tcp_max_syn_backlognet.core.somaxconnnet.core.netdev_max_backlog 1 &#xff09; net.ipv4…

书生大模型实战营(1)——InterStudio基础知识+Vscode SSH连接远程服务器+Linux基础指令

参加书生.浦江大模型实战训练营&#xff0c;学习大模型知识和微调技术&#xff0c;所有课程免费&#xff0c;通过闯关的形式学习&#xff0c;也比较有趣。一起来了解LLM的世界。邀请链接 产品简介 InternStudio 是大模型时代下的云端算力平台。基于 InternLM 组织下的诸多算法…

小程序全局挂载对像

1. 定义并导出 `utils` 模块 // utils.js const utils = {/*** 用户消息反馈* @param {string} title 文字提示的内容*/toast(title = 数据加载失败...) {wx.showToast({title,mask: true,icon: none,});} }// 挂载到全局对象 wx wx.utils = utils;// 模块导出 export default…

使用 FormCreate 渲染 Element Plus 表单

使用 FormCreate 渲染 Element Plus 表单 FormCreate 支持多个主流 UI 框架&#xff0c;您可以根据自己项目的需求选择对应的版本进行安装。 请根据您项目中使用的 UI 框架&#xff0c;安装对应的 FormCreate 版本。 Vant UI 版本 移动端 npm i form-create/vant^3Element Pl…

高级java每日一道面试题-2024年9月01日-基础篇-事物的隔离级别?

如果有遗漏,评论区告诉我进行补充 面试官: 事物的隔离级别? 我回答: 事务的隔离级别是一个重要的考点。事务的隔离级别决定了一个事务在访问数据库时如何受到其他事务的影响&#xff0c;以及不同事务之间的并发控制程度。下面将详细解释Java中事务的隔离级别。 事务的隔离…

【工控】线扫相机小结 第二篇

背景 上一篇中《线扫相机小结》中介绍了一些基础知识和注意事项&#xff0c;这一篇是对上一篇的进一步补充。 会介绍线扫相机的一些调试技巧。 如何在线调试&#xff1f; 我们知道&#xff0c;线扫相机不能像面阵相机一样实时的呈现图像&#xff0c;只能一行行的扫描&#x…

HX711—称重模块

1、简介 HX711 采用了海芯科技集成电路专利技术&#xff0c; 是一款专为高精度电子秤而设计的 24 位 A/D 转 换器芯片。 2、原理图 PCB参考设计原理图 3、模块驱动代码&#xff08;固件库&#xff09; 数据读取代码分析 HX711信号读取时序 初始化&#xff1a; 将 PD_SCK&…

COCO数据集缺失文件补全方法

COCO2017数据集图片文件缺失自动补全方法 一、前言 本文代码是以目标检测&#xff08;object detection&#xff09;和实例分割&#xff08;instance segmentation&#xff09;任务的标签文件为例&#xff0c;即instances_train/val/test2017.json文件。 其他任务的标签文件…

原生冻结进程分析(U)

一、概要 1.定义&#xff1a; 当应用切换到后台并且没有其他活动时&#xff0c;系统会在一定时间内通过状态判断&#xff0c;将进程 ID 迁移到冻结的 cgroup 节点上&#xff0c;实现冻结 CACHE 应用。这项功能可以减少活跃缓存应用在后台存在时所消耗的 CPU 资源&#xff0c;从…

armv8 memory model概述

概述 在armv8 架构中&#xff0c;它引入了更多的维度来描述内存模型&#xff0c;从而在此基础上进行硬件优化(但其中一些并未被主流的软件所接受)&#xff0c;在此做一些简单的整理&#xff0c;更多信息请参考 Arm spec 以及 AMBA 协议。下文主要是对Memory 和 Device 两大类的…

getopts(1) builtin command

文章目录 0.背景1.简介2.格式3.选项4.返回值5.特殊变量6.示例参考文献 0.背景 在执行 Shell 脚本时&#xff0c;可以像运行应用程序一样传入相应的参数&#xff0c;在脚本内部根据传入的参数内容执行对应的操作。 Shell 脚本中可以通过$1...$N形式的符号来引用传入的参数&…

基于nodejs+vue+uniapp的摄影竞赛小程序

开发语言&#xff1a;Nodejs框架&#xff1a;expressuniapp数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;VS Code 系统展示 管理员登录 管理员主界面 用户管理 书籍分类管理 书籍信息管理 系统管理…

昇腾AI处理器的计算核心 - AI Core即DaVinci Core

昇腾AI处理器的计算核心 - AI Core即DaVinci Core flyfish 从一段代码的解释开始 template <typename T> class GlobalTensor { public:void setGlobalBuffer(T* buffer, uint32_t buffersize) {// 在这里实现设置全局缓冲区的逻辑} };语法的说明&#xff0c;主要用于…

fl studio 21/24破解版(水果音乐制作软件24) v24.1.1.4285附安装教程

fl studio 21/24破解版&#xff0c;又被国内网友称之为水果音乐制作软件24&#xff0c;是Image-Line公司成立26周年而发布的一个版本&#xff0c;是目前互联网上最优秀的完整的软件音乐制作环境或数字音频工作站&#xff0c;包含了编排&#xff0c;录制&#xff0c;编辑&#x…

在Ubuntu 20.04上安装MySQL的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 MySQL 是一个开源的数据库管理系统&#xff0c;通常作为流行的 LAMP&#xff08;Linux、Apache、MySQL、PHP/Python/Perl&#xf…

Cmake之1.0版本重要特性及用法实例(八)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

GoodSync Business - 企业级服务器同步与备份工具

现在越来越多公司会搭建服务器&#xff0c;或自建文件共享中心。那么如何才能实现对这些终端的高效管理、安全备份&#xff0c;以保障企业数据的安全呢&#xff1f; GoodSync Business 就是一款企业服务器同步与备份工具&#xff0c;适用于 Win / Mac 工作站&#xff0c;以及 …