注册 登录
  • 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

C++磁盘文件排序代码

OC/C/C++ 水墨上仙 2826次浏览 已收录 手机上查看

输入: 一个最多有n个不重复的正整数的文件,其中每个数都小于n,且n=10^7

输出: 得到按小到大升序排列的包含所有输入的整数列表

要求: 最多有1MB内存空间可用,但磁盘空间足够。要求运行时间10秒为佳。


#include <iostream>
#include <bitset>
#include <assert.h>
#include <time.h>

using namespace std;

const int max_each_scan=5000000;

int main()
{
	clock_t begin=clock();
	bitset<max_each_scan> bit_map;
	bit_map.reset();

	FILE *fp_unsort_file=fopen("data.txt","r");
	assert(fp_unsort_file);

	int num;
	while(fscanf(fp_unsort_file,"%d ",&num) != EOF)
	{
           if(num < max_each_scan)
	   {
	      bit_map.set(num,1);
	   }
	}

	FILE *fp_sort_file = fopen("sort.txt","w");
	assert(fp_sort_file);

	for(int i=0; i<max_each_scan;i++)
	{
		if(bit_map[i] ==1)
		{
			fprintf(fp_sort_file,"%d  ",i);
		}
	}
   
	int result=fseek(fp_unsort_file,0,SEEK_SET);
	if (result)
	{
		cout<<"fseek faild"<<endl;
	}
	else
	{
		bit_map.reset();
		while (fscanf(fp_unsort_file,"%d",&num) != EOF)
		{
			if ( num >= max_each_scan && num < 1000000)
			{
				num -= max_each_scan;
				bit_map.set(num,1);
			}
		}

	}
	for (int i=0;i<max_each_scan;i++)
	{
		if (bit_map[i] == 1)
		{
			fprintf(fp_sort_file,"%d",i+max_each_scan);
		}
	}

	clock_t end=clock();

	cout<<"bitmap time:"<<endl;
	cout<<(end - begin)/CLK_TCK <<"s"<<endl;

	fclose(fp_sort_file);
	fclose(fp_unsort_file);

	return 0;

}


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明C++磁盘文件排序代码
喜欢 (0)
[开心洋葱]
分享 (0)
关于作者:
水墨上仙
……
加载中……