| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 793 人关注过本帖
标题:大容量排序算法:
取消只看楼主 加入收藏
sccdyc
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2006-4-23
收藏
 问题点数:0 回复次数:0 
大容量排序算法:

大容量排序算法:
前言:
在内存容量有限,并且栈容量有限的情况下,我们是不能声明如int array[10000000000]的数的,那我们应该怎么排序大容量的数据呢、本文给数了一种方法,在VC++6.0中编译通过。
程序如下:
1.生成随机数文件
2.排序该文件
1)
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
#include<time.h>

typedef struct tagDATAHEADER//文件头
{
long datalength;//数据长度
long dataoffset;//数据偏移量
char author[20];//作者,也就是我了
char time[50];//生成随机数文件的时间
char remain[432];//保留
}Dataheader;

int main(void)
{
long i,num;
FILE *fp;
time_t ltime;
Dataheader dataheader;
printf("input data length:");
scanf("%ld",&dataheader.datalength);
dataheader.dataoffset=sizeof(dataheader)*10;
strcpy(dataheader.author,"YangCheng");
time( &ltime );
strcpy(dataheader.time,asctime(gmtime(&ltime)));
fp=fopen("sort.dat","wb");
if(fp==NULL)
{
printf("open file error!");
return -1;
}
if(fwrite(&dataheader,sizeof(dataheader),1,fp)!=1)
{
printf("write file error!");
return -1;
}
srand( (unsigned)time(NULL));
fseek(fp,dataheader.dataoffset,SEEK_SET);//注意偏移量
for(i=0;i<dataheader.datalength;i++)
{
num=rand()%10000;//生成随机数
if(fwrite(&num,sizeof(long),1,fp)!=1)
{
printf("write file error!");
return -1;
}
}
fclose(fp);
return 0;
}

2)
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
#include<time.h>

typedef struct tagDATAHEADER
{
long datalength;
long dataoffset;
char remain[512];
}Dataheader;

int main(void)
{
Dataheader dataheader;
long pre,next,i,j,num,offset;
FILE *fp1,*fp2,*fp;
offset=sizeof(long);
printf("\nSource Data:\n\n");//未排序时的数据
fp=fopen("sort.dat","rb");
if(fp==NULL)
{
printf("read error!");
return -1;
}
fread(&dataheader,sizeof(dataheader),1,fp);
fseek(fp,dataheader.dataoffset,SEEK_SET);
for(i=0;i<dataheader.datalength;i++)
{
fread(&num,sizeof(long),1,fp);
printf("%ld ",num);
}
fclose(fp);


fp1=fopen("sort.dat","rb+");
fp2=fopen("sort.dat","rb+");
if(fp1==NULL||fp2==NULL)
{
printf("read error!");
return -1;
}
for(i=0;i<dataheader.datalength-1;i++)//注意长度
{
fseek(fp1,dataheader.dataoffset,SEEK_SET);//注意偏移量
fseek(fp2,dataheader.dataoffset+offset,SEEK_SET);
for(j=0;j<dataheader.datalength-1;j++)
{
if(!feof(fp1)&&!feof(fp2))
{
fread(&pre,offset,1,fp1);
fread(&next,offset,1,fp2);
if(pre>next)//从小到大排序
{
fseek(fp1,-offset,SEEK_CUR );
fseek(fp2,-offset,SEEK_CUR );//注意指针的位置的改变
fwrite(&next,offset,1,fp1);
fwrite(&pre,offset,1,fp2);
fflush(fp1);
fflush(fp2);

}
}
}

}
fclose(fp1);
fclose(fp2);


printf("\n\nSorted Data:\n\n");//排完顺序后的数据
fp=fopen("sort.dat","rb");
if(fp==NULL)
{
printf("read error!");
return -1;
}
fread(&dataheader,sizeof(dataheader),1,fp);
fseek(fp,dataheader.dataoffset,SEEK_SET););//注意偏移量
for(i=0;i<dataheader.datalength;i++)
{
fread(&num,sizeof(long),1,fp);
printf("%ld ",num);
}
fclose(fp);
printf("\n");
return 0;
}

搜索更多相关主题的帖子: 算法 容量 
2007-10-05 17:32
快速回复:大容量排序算法:
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019555 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved