17 外排序

排序分为内排序和外排序,内排序是在内存中的排序。外排序指在磁盘中文件的排序,因为在磁盘中,不能进行下标访问,归并排序经常用于磁盘中文件的排序

假如有10亿个整形数据在磁盘中,要对它排序,内存中只有1G空间,10亿需要4G。可以将这个文件划分成好几块1G大小的排序,再对这些1G文件两两归并,得到4G的排序后文件

在这里插入图片描述

方便演示外排序,手动生成100的数据量,命名为data.txt文件每10个数据读到内存中一排序,可以用快速排序,排完序写到新文件,sub+编号.txt,不断循环对这些小文件归并汇总并生成新文件
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>void Swap(int* a, int* b)
{int temp = *a;*a = *b;*b = temp;
}//三数取中
int GetIndex(int ary[], int left, int right)
{//int mid = (left + right) / 2;int mid = left + rand() % (right - left);if (ary[mid] > ary[left]){if (ary[mid] < ary[right]){return mid;}else if (ary[left] > ary[right]){return left;}else{return right;}}//ary[mid] < ary[left]else{if (ary[mid] > ary[right]){return mid;}else if (ary[left] > ary[right]){return right;}else{return left;}}
}int QSplit(int ary[], int left, int right)
{//三数取中int mid = GetIndex(ary, left, right);Swap(&ary[left], &ary[mid]);int keyi = left;while (left < right){//右边找小while (left < right && ary[right] >= ary[keyi]){right--;}//左边找大while (left < right && ary[left] <= ary[keyi]){left++;}Swap(&ary[left], &ary[right]);}Swap(&ary[left], &ary[keyi]);return left;
}//升序排列 区间[left,right]
void Qsort(int ary[], int left, int right)
{//区间错误,返回if (left >= right){return;}int keyi = QSplit(ary, left, right);//递归左右区间,keyi处除外Qsort(ary, left, keyi - 1);Qsort(ary, keyi + 1, right);}void MergeFile(const char* file1, const char* file2, const char* mfile)
{FILE* fout1;fout1 = fopen(file1, "r");FILE* fout2;fout2 = fopen(file2, "r");FILE* fin;fin = fopen(mfile, "w");int num1 = 0;int num2 = 0;int ret1 = fscanf(fout1, "%d", &num1);int ret2 = fscanf(fout2, "%d", &num2);while (ret1 != EOF && ret2 != EOF){if (num1 <= num2){fprintf(fin, "%d\n", num1);ret1 = fscanf(fout1, "%d", &num1);}else{fprintf(fin, "%d\n", num2);ret2 = fscanf(fout2, "%d", &num2);}}while (ret1 != EOF){fprintf(fin, "%d\n", num1);ret1 = fscanf(fout1, "%d", &num1);}while (ret2 != EOF){fprintf(fin, "%d\n", num2);ret2 = fscanf(fout2, "%d", &num2);}fclose(fout1);fclose(fout2);fclose(fin);
}int main()
{FILE* fdata;fdata = fopen("data.txt", "r");//分割一段段数据,内存排序写到小文件int ary[10];int n = 10; //每10个排序int num = 0; //临时读取内容char subfile[20]; //小文件名字int filei = 1;  //小文件编号int i = 0;while (fscanf(fdata, "%d", &num) != EOF){if (i < n){ary[i++] = num;}//排序if (i == 10){Qsort(ary, 0, n - 1);sprintf(subfile, "sub%d.txt", filei++);FILE* fsub;fsub = fopen(subfile, "w");for (int i = 0; i < n; i++){fprintf(fsub, "%d\n", ary[i]);}fclose(fsub);i = 0;}}//互相归并到文件,实现整体有序char file1[100] = "sub1.txt";char file2[100] = "sub2.txt";char mfile[100] = "merge.txt";for (int i = 2; i <= filei - 1; i++){//读取file1和file2,归并出mfileMergeFile(file1, file2, mfile);remove(file1);remove(file2);strcpy(file1, mfile);sprintf(file2, "sub%d.txt", i + 1);sprintf(mfile, "merge%d.txt",i + 1);}printf("hello world\r\n");return 0;
}

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

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

相关文章

海量数据处理商用短链接生成器平台 - 4

第六章 架构核心技术-池化思想-异步结合 性能优化最佳实践 第1集 RestTemplate里面的存在的问题你知道多少- Broken pipe错误 项目就更新到第六章了&#xff0c;剩下的内容 放百度网盘里面了&#xff0c;需要的来取。 链接&#xff1a;https://pan.baidu.com/s/19LHPw36dsxPB7…

Java安全 CC链6分析

CC链6分析 前言CC链分析核心transform链Lazymap类TiedMapEntry类HashMap方法 最终exp 前言 CC链6不受jdk版本与cs版本的影响&#xff0c;在Java安全中最为通用&#xff0c;并且非常简洁&#xff0c;非常有学习的必要&#xff0c;建议在学习CC链6之前先学习一下 URLDNS链 和 CC…

Unity类银河恶魔城学习记录7-4 P70 Improving sword‘s behaviour源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Sword_Skill_Controller.cs using System.Collections; using System.Colle…

请求https网站报错

最近在做爬虫项目时遇到的一个报错&#xff0c;说是SSL证书验证失败。 开始还以为是代理又出了问题&#xff0c;后来经过查阅各种资料了解到这是因为Python2.7.9之后的版本在调用urllib.urlopen时会先验证一下https网站的SSL证书&#xff0c;而目标网站使用的是自签名的证书&am…

静态时序分析:SDC约束命令set_clock_uncertainty

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 set_clock_uncertainty是用来指定设计中时钟周期的不确定性&#xff0c;不确定性指的是对那些会对时钟周期造成的负面影响。这些不确定性可能来源于时钟抖动(clo…

ChatGPT4 教你如何完成SQL的实践应用

对数据库的各项应用与操作都离不开SQL来对数据进行增删改查。 例如 &#xff1a; 有一张某公司职员信息表如下&#xff1a; 需求1&#xff1a;在公司职员信息表中&#xff0c;请统计各部门&#xff0c;各岗位下的员工人数。 如果这个SQL语句不会写或者不知道怎么操作可以交给…

LLM大模型常见问题解答(2)

对大模型基本原理和架构的理解 大型语言模型如GPT&#xff08;Generative Pre-trained Transformer&#xff09;系列是基于自注意力机制的深度学习模型&#xff0c;主要用于处理和生成人类语言。 基本原理 自然语言理解&#xff1a;模型通过对大量文本数据的预训练&#xff…

(三十八)大数据实战——Atlas元数据管理平台的部署安装

前言 Apache Atlas 是一个开源的数据治理和元数据管理平台&#xff0c;旨在帮助组织有效管理和利用其数据资产。为组织提供开放式元数据管理和治理功能 &#xff0c;用以构建其数据资产目录&#xff0c;对这些资产进行分类和管理&#xff0c;形成数据字典 。并为数据分析师和数…

幻兽帕鲁开服教程:零基础服务器搭建超简单!

幻兽帕鲁官方服务器不稳定&#xff1f;自己搭建幻兽帕鲁服务器&#xff0c;低延迟、稳定不卡&#xff0c;目前阿里云和腾讯云均推出幻兽帕鲁专用服务器&#xff0c;腾讯云直接提供幻兽帕鲁镜像系统&#xff0c;阿里云通过计算巢服务&#xff0c;均可以一键部署&#xff0c;鼠标…

几种常见密码形式

1、栅栏易位法 即把将要传递的信息中的字母交替排成上下两行&#xff0c; 再将下面一行字母排在上面一行的后边&#xff0c; 从而形成一段密码。 举例&#xff1a; TEOGSDYUTAENNHLNETAMSHVAED 解&#xff1a; 将字母分截开排成两行&#xff0c;如下 T E O G S D Y U T A E N N…

【Linux 02】权限基本概念

文章目录 &#x1f308; Ⅰ 权限概念&#x1f308; Ⅱ 权限管理1. 文件访问者分类 (角色)2. 文件类型和访问权限 (事物属性)3. 文件权限值表示方法 &#x1f308; Ⅲ 权限修改1. chmod 设置文件访问权限2. chown 修改文件拥有者3. chgrp 修改文件或目录的所属组 &#x1f308; …

2000-2021年县域指标统计数据库

2000-2021年县域统计数据库 1、时间&#xff1a;2000-2021年 2、来源&#xff1a;县域统计年鉴 3、范围&#xff1a;2500县 5、指标&#xff1a; 地区名称、年份、行政区域代码、所属城市、所属省份、行政区域土地面积平方公里、乡及镇个数个、乡个数个、镇个数个、街道办…