VC++2012编程演练数据结构《36》磁盘文件进行排序
来源:互联网 发布:java.util.hashmap 编辑:程序博客网 时间:2024/05/29 03:09
如何给磁盘文件排序
问题描述:
输入:一个最多含有n个不相同的正整数的文件,其中每个数都小于等于n,且n=10^7。
输出:得到按从小到大升序排列的包含所有输入的整数的列表。
条件:最多有大约1MB的内存空间可用,但磁盘空间足够。且要求运行时间越短越好。
分析:一步一步地解决这个问题,
调用如下
运行如下
代码下载
问题描述:
输入:一个最多含有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
- VC++2012编程演练数据结构《36》磁盘文件进行排序
- VC++2012编程演练数据结构《22》常规排序算法
- VC++2012编程演练数据结构《23》二叉树排序
- VC++2012编程演练数据结构《28》拓扑排序算法
- VC++2012编程演练数据结构《32》桶排序
- VC++2012编程演练数据结构《33》希尔排序
- VC++2012编程演练数据结构《34》树形选择排序
- VC++2012编程演练数据结构《19》散列文件
- VC++2012编程演练数据结构《20》索引文件
- VC++2012编程演练数据结构《6》优先级队列演练
- VC++2012编程演练数据结构《11》哈希表
- VC++2012编程演练数据结构《12》二叉排序树
- VC++2012编程演练数据结构《13》单链表
- VC++2012编程演练数据结构《21》二叉排序树
- VC++2012编程演练数据结构《24》哈夫曼树
- VC++2012编程演练数据结构《29》图
- VC++2012编程演练数据结构《1》循环双端队列
- VC++2012编程演练数据结构《5》堆栈实现递归运算
- 分析Java类加载全过程
- VS2010用MFC显示系统当前时间
- 字典树
- iOS 5 Tech Talk: Michael Jurewitz on Performance Measurement
- Javascript实现弹出菜单,弹出窗口
- VC++2012编程演练数据结构《36》磁盘文件进行排序
- 算符优先算法(FIRSTVT集,LASTVT集,判读是否是算符优先文法,算符优先矩阵,句子分析)
- 用C语言实现常见的几个排序方法
- Popular Study cards for Secondaries, Harvard
- KMP算法
- Drupal7_10:首页幻灯片的实现
- VC++6.0&&VS2008&MFC&API学习问题总结(三)(多线程更新控件)
- BM算法
- Java学习笔记(十)