如何给磁盘文件排序
问题描述:
输入:一个最多含有n个不相同的正整数的文件,其中每个数都小于等于n,且n=10^7。
输出:得到按从小到大升序排列的包含所有输入的整数的列表。
条件:最多有大约1MB的内存空间可用,但磁盘空间足够。且要求运行时间越短越好。
分析:一步一步地解决这个问题,

创建一个工程

声名如下

#include "stdafx.h"//对外存文件(磁盘文件)进行排序的算法
typedef struct
{int key;
int stn;}ElemType;
int b=sizeof(ElemType);
//类定义
class LoadFile
{public:
//构造函数
//向物理文件名为fname指针所指文件中输出n个记录
LoadFile(char* fname,int n);
//采用选择排序法对文件A的记录进行排序
void FMergeSort(fstream &A,ElemType (&a)[10],int n);
//顺序打印ff文件中每个记录
void Print(fstream &ff);
};
//类的实现
//向物理文件名为fname指针所指文件中输出n个记录
LoadFile::LoadFile(char* fname,int n)
{fstream f(fname,ios::out|ios::dec|ios::trunc);
//用所给的物理文件名定义一个输出文件流对象f,
//它是与物理文件相对应的逻辑文件
if(!f) {cerr<<fname<<' '<<"not found!"<<endl;exit(1);}
for(int i=0;i<n;i++)
{//假定向每个记录的排序码域输入数据,其值由随机产生ElemType x;x.key=i;x.stn=rand()%200;f.write((char *)&x,b);}
f.close();}//关闭逻辑文件f
//采用选择排序法对文件A的记录进行排序
void LoadFile::FMergeSort(fstream &A,ElemType (&a)[10],int n)
{int i,j,k;
A.seekg(0,ios::end);//将文件指针移至文件未
A.seekg(0);//将文件指针移至文件首
for(i=0;i<n;i++)
A.read((char*)&a[i],b);//从文件中读一记录到a[i]中
for(i=0;i<n-1;i++)
{k=i;
for(j=i+1;j<n;j++)
if(a[k].stn>a[j].stn) k=j;
if(k!=i)
{int t;
t=a[k].stn;a[k].stn=a[i].stn;a[i].stn=t;
t=a[k].key;a[k].key=a[i].key;a[i].key=t;}
}
A.seekg(0);
for(i=0;i<10;i++)
A.write((char *)&a[i],b);
}
//顺序打印ff文件中每个记录
void LoadFile::Print(fstream &ff)
{ElemType x;
ff.seekg(0,ios::end);//将文件指针移至文件未
int n=ff.tellg()/b;  //用n表示文件所含的记录数
ff.seekg(0);  //将文件指针移至文件首
for(int i=0;i<n;i++) {ff.read((char*)&x,b);//从文件中读一记录到x中cout<<setw(4)<<x.stn;}
cout<<endl;
}

调用如下

void main()
{cout<<"运行结果:\n";
int m=10;
char *fa=".\\ak1.dat";
ElemType d[10];
srand(time(0));
fstream fna(fa,ios::out|ios::in|ios::dec|ios::trunc);
cout<<"文件未排序前的结果:\n";
LoadFile myfile(fa,m);
myfile.Print(fna);
cout<<"文件排序后的结果:\n";
myfile.FMergeSort(fna,d,m);
myfile.Print(fna);fna.close();cin.get();
}

运行如下

代码下载

http://download.csdn.net/detail/yincheng01/4790150

转载于:https://www.cnblogs.com/new0801/archive/2012/11/20/6177631.html

VC++2012编程演练数据结构《36》磁盘文件进行排序相关推荐

  1. VC++2012编程演练数据结构《3》堆栈实现进制转换

    栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表.它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出 ...

  2. VC++2012编程演练数据结构《35》多路平衡归并

    多路平衡归并 一般说来,如果初始归并段有m个,那么这样的二路归并树就有élog2mù+1层,要对数据进行élog2mù遍扫描.采用k路平衡归并时,则相应的归并树有élogkmù+1层,要对数据进行él ...

  3. VC++2012编程演练数据结构《31》狄杰斯特拉算法

    狄杰斯特拉算法 Dijkstra(狄杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很 ...

  4. VC++2012编程演练数据结构《12》二叉排序树

    二叉排序树(Binary Sort Tree)又称二叉查找树. 它或者是一棵空树:或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值: (2)若右子树不空,则 ...

  5. VC++2012编程演练数据结构《25》线索二叉树

    线索二叉树 按照某种遍历方式对二叉树进行遍历,可以把二叉树中所有结点排序为一个线性序列.在该序列中,除第一个结点外每个结点有且仅有一个直接前驱结点:除最后一个结点外每一个结点有且仅有一个直接后继结点. ...

  6. VC++2012编程演练数据结构《9》平衡二叉搜索树

    平衡二叉搜索树 任何结点的左子树和右子树高度最多相差1的二叉搜索树. (1)AVL树的插入算法 a. 插入结点之后仍然是AVL树,则不调整: b. 插入结点之后不再满足AVL树条件,则进行调整,根据导 ...

  7. vc 界面编程常用方法 listctrl toolbar

      vc 界面编程常用方法收藏 新一篇: Building SQLite3 with Visual Studio 2005 | 旧一篇: Visual Studio 2005 IDE 技巧和窍门 &l ...

  8. VC数据库编程总结(二)

    一.访问数据库技术方法......................................................................................... ...

  9. C、C++以及widows编程、数据结构算法等编程书籍推荐

    推荐几本好书么     当然,FAQ的目的之一就是这个.我将分别介绍纯C.C++以及widows编程.数据结构算法以及图形库等等的教材.市场上这些主题中任意一个的教材都是汗牛充栋,读都读不完.不过很显 ...

最新文章

  1. poj2217详解 ( 后缀数组 + 高度数组 )
  2. 再度吐槽,PHP在centos7的安装方式稍不注意可能就打击你的积极性
  3. 【TensorFlow】TensorFlow从浅入深系列之八 -- 教你学会变量管理
  4. Spring学习笔记002 - AOP
  5. 关于mysql中select出数据未排序问题
  6. [翻译]用表单字段加亮的方式为用户提供友好的界面
  7. python中的rt_TensorRT学习总结
  8. nuke软件功能有哪些?苹果Mac影视后期特效合成软件NUKE 13
  9. OpenStack峰会喊你回家吃饭
  10. 计算机网络ip地址博客,计算机网络中,这些IP地址你知道吗?
  11. 达内微软mta证书有用吗_mta证书值得拿吗 怎么样才能拿到mta证书
  12. android荣耀不弹出获取权限提醒,荣耀手机怎么设置锁屏消息提示?附不提示的解决方法...
  13. KDJ、RSI、MACD
  14. 字符串字符数组的赋值
  15. 科罗拉多州立大学计算机科学,科罗拉多州立大学的世界排名
  16. coreldraw插件编写
  17. Android如何实现模态对话框(Modal Dialog)
  18. 计算机专业的英文介绍,计算机专业英文自我介绍
  19. linux服务器添加字体(宋体)
  20. Java如何获取MD5值

热门文章

  1. 添加负载机_从 Coco 转向 Koko,Jumpserver 堡垒机 V1.5.3 发布
  2. 哪些SQL语句会引起全表扫描
  3. layer右下脚弹窗
  4. java上拉变量_「小程序JAVA实战」小程序页面的上拉下拉刷新(50)
  5. JavaScript文档对象模型DOM节点操作之父节点和子节点(2)
  6. java关键字值transient
  7. upper_bound( )和lower_bound()的用法
  8. 2013-2017蓝桥杯省赛C++A组真题总结(题型及解法)
  9. 最小可用ID(4种方法,详细讲解)
  10. bzoj 1113: [Poi2008]海报PLA(栈)