作为一个菜鸟,知道在学习编程的路上会非常艰辛,在此记录一些自己的学习和算法,一来方便自己查阅,二来,如果能给也是刚入门的“菜鸟”一些参考作用的话我就非常高兴了。如果您对我的文章有任何疑惑或者建议,望不吝指教。
其实在网上已经有各种各样的大神,提供了各种各种的优秀算法,也有许多优秀的博文,给了我很多的启发。作为一个菜鸟,花了许多时间去弄懂那些算法,然后自己写了并不算最优化的算法,但是尽量做到易懂。
在关于输入输出文件的海量数据的相关问题,在下面这个网址有优秀,详细的介绍。
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
各位大侠如果有什么意见或建议,望不吝指教。如果本文能够对和我一样新学的“菜鸟”有那么点作用的话,我非常高兴