菜鸟学算法:输入输出文件的海量数据(快速排序,数组排序)

本文记录了一名编程新手的学习历程,分享了自己在算法与数据结构方面的学习经验,包括生成随机数据、排序算法应用以及输出操作。通过实例展示了快速排序算法和一种利用数组下标的方法进行数据排序的过程,并比较了两种方法的运行时间。同时,介绍了归并排序的概念及链接资源。旨在为同样处于编程学习初期的读者提供参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作为一个菜鸟,知道在学习编程的路上会非常艰辛,在此记录一些自己的学习和算法,一来方便自己查阅,二来,如果能给也是刚入门的“菜鸟”一些参考作用的话我就非常高兴了。如果您对我的文章有任何疑惑或者建议,望不吝指教。

其实在网上已经有各种各样的大神,提供了各种各种的优秀算法,也有许多优秀的博文,给了我很多的启发。作为一个菜鸟,花了许多时间去弄懂那些算法,然后自己写了并不算最优化的算法,但是尽量做到易懂。

在关于输入输出文件的海量数据的相关问题,在下面这个网址有优秀,详细的介绍。

http://blog.youkuaiyun.com/v_JULY_v/article/details/6451990

下面给出自己的快速排序的算法。算法中包括了生成一千万个随机数据(不重复),输出到文件,从文件取一千万个数据,排序,输出到令一个文件。

运行时间可能会有点长,时间因机器而异(我的破电脑老啦),上面链接的14s的算法在我机器上运行40s,而且写博文时我机器运行比较多东西,所以时间多了10s+。

#include <iostream>
#include <time.h>
#include <fstream>
using namespace std;
#define N 10000000
int num[N];
int sortNum[N];
void swap(int *a,int *b)
{
	int temp;
	temp=*a;
	*a=*b;
	*b=temp;
}
void quickSort(int a[],int m,int n)
{
	if(m<n)
	{
	int temp=a[m],L=m,R=n;
	while (L<R)
	{
		while(L<R&&temp<a[R])
			R--;
		a[L]=a[R];
		while(L<R&&temp>a[L])
			L++;
		a[R]=a[L];
	}
	a[L]=temp;
	quickSort(a,m,L-1);
	quickSort(a,L+1,n);
	}
}
void main()
{
	//生成N个数随机到dataUnsort文件中
	clock_t beginTime=clock();/////////////////////////////
	int temp;
	for (int i=0;i<N;i++)
	{
		num[i]=i;
	}
	for (int i=0;i<N;i++)
	{
		temp=time(NULL)*rand()%N;
		swap(num[i],num[temp]);
	}

	clock_t creatTime=clock();//////////////////////////////

	ofstream OutPutFile;
	OutPutFile.open("dataUnsort.txt");
	for (int i=0;i<N;i++)
	{
		OutPutFile<<num[i]<<'\t';
	}
	OutPutFile.close();

	clock_t OutPutTime=clock();////////////////////////////////
	//从dataUnsort文件中取出全部数字
	ifstream InPutFile;
	InPutFile.open("dataUnsort.txt");
	int j=0;
	while(InPutFile>>sortNum[j])
		j++;
	InPutFile.close();
	quickSort(sortNum,0,j-1);

	clock_t SortTime=clock();//////////////////////////////////
	//将N个数排序输出到data文件中

	ofstream OutPutFile2;
	OutPutFile2.open("data.txt");
	for (int i=0;i<N;i++)
	{
		OutPutFile2<<sortNum[i]<<'\t';
	}
	OutPutFile2.close();


	//各阶段运行时间
	clock_t endTime=clock();//////////////////////////
	cout<<"beginTime is:"<<beginTime<<endl;
	cout<<"creatTime is:"<<creatTime<<endl;
	cout<<"OutPutTime is:"<<OutPutTime<<endl;
	cout<<"SortTime is:"<<SortTime<<endl;
	cout<<"endTime is:"<<endTime<<endl;
	cout<<endl<<"creatTime Used:"<<creatTime-beginTime<<endl;
	cout<<"OutPutTime Used:"<<OutPutTime-creatTime<<endl;
	cout<<"SortTime Used:"<<SortTime-OutPutTime<<endl;
	cout<<"writeTime Used:"<<endTime-SortTime<<endl;
	system("pause");
}
看上面链接的有说到位图,自己不太懂,也没什么时间去弄,于是就想到直接用数组。于是就有了下面的数组下标的程序。

个人感觉利用数组下标的方法不需要快速排序,运行时间会比快速排序法更短,但是在我机器上居然时间相差无几,真奇怪。

 
#include <iostream>
#include <time.h>
#include <fstream>
using namespace std;
#define N 10000000
int num[N];
bool sortNum[N];
void swap(int *a,int *b)
{
	int temp;
	temp=*a;
	*a=*b;
	*b=temp;
}
void main()
{
	//生成N个数随机到dataUnsort文件中
	clock_t beginTime=clock();/////////////////////////////
	int temp;
	for (int i=0;i<N;i++)
	{
		num[i]=i;
	}
	for (int i=0;i<N;i++)
	{
		temp=time(NULL)*rand()%N;
		swap(num[i],num[temp]);
	}

	clock_t creatTime=clock();//////////////////////////////
	//将N个随机数列输出到dataUnsort.txt
	ofstream OutPutFile;
	OutPutFile.open("dataUnsort.txt");
	for (int i=0;i<N;i++)
	{
		OutPutFile<<num[i]<<'\t';
	}
	OutPutFile.close();

	clock_t OutPutTime=clock();////////////////////////////////
	//从dataUnsort文件中取出全部数字
	ifstream InPutFile;
	InPutFile.open("dataUnsort.txt");
	int j;
	while(InPutFile>>j){sortNum[j]=1;}
	InPutFile.close();

	clock_t SortTime=clock();//////////////////////////////////
	//将N个数排序输出到data文件中
	cout<<"running";
	ofstream OutPutFile2;
	OutPutFile2.open("data.txt");
	for (int i=0;i<N;i++)
	{
		if(sortNum[i]==1)
			OutPutFile2<<i<<'\t';
	}
	OutPutFile2.close();


	//各阶段运行时间
	clock_t endTime=clock();//////////////////////////
	cout<<"beginTime is:"<<beginTime<<endl;
	cout<<"creatTime is:"<<creatTime<<endl;
	cout<<"OutPutTime is:"<<OutPutTime<<endl;
	cout<<"SortTime is:"<<SortTime<<endl;
	cout<<"endTime is:"<<endTime<<endl;
	cout<<endl<<"creatTime Used:"<<creatTime-beginTime<<endl;
	cout<<"OutPutTime Used:"<<OutPutTime-creatTime<<endl;
	cout<<"SortTime Used:"<<SortTime-OutPutTime<<endl;
	cout<<"writeTime Used:"<<endTime-SortTime<<endl;
	system("pause");
}

编程艺术上的博文还提到了归并排序,个人觉得以下这篇链接上的表述更容易明白

http://blog.youkuaiyun.com/morewindows/article/details/6678165

各位大侠如果有什么意见或建议,望不吝指教。如果本文能够对和我一样新学的“菜鸟”有那么点作用的话,我非常高兴

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值