任务描述:
生成50000个随机数,存于input.txt中,然后通过插入排序和归并排序,分别输出到OutputInsertion.txt和OutputMerge.txt中,并统计运行时间。来体会算法的时间复杂度。
代码如下:
//编译环境:GCC 3.4.5,Ubuntu 12.04 LTS
//2014.3.26
#include <iostream>
#include <fstream>
#include <algorithm>
#include <ctime>
#include <iomanip>
#include <cstring>
using namespace std;
const int MaxArraySize=50002;
const int maxint=0x3f3f3f3f;
int origin[MaxArraySize];
int origin2[MaxArraySize];
void InsertionSort(int n,int a[])
{
int key,i;
for(int j=1;j<n;j++)
{
key=a[j];
i=j-1;
while(i>=0 && a[i]>key)
{
a[i+1]=a[i];
i--;
}
a[i+1]=key;
}
}
void Merge(int A[],int p,int q,int r)
{
int len_left=q-p+1;
int len_right=r-q;
int *L=new int [MaxArraySize];
int *R=new int [MaxArraySize];
for(int i=0;i<len_left;i++)
{
L[i]=A[p+i];
}
for(int j=0;j<len_right;j++)
{
R[j]=A[q+j+1];
}
L[len_left]=maxint;
R[len_right]=maxint;
int i=0,j=0;
for(int k=p;k<=r;k++)
{
if (L[i]<=R[j])
{
A[k]=L[i];
i++;
}
else
{
A[k]=R[j];
j++;
}
}
}
void MergeSort(int A[],int p,int r)
{
int q;
if(p<r)
{
q=(p+r)/2;
MergeSort(A,p,q);
MergeSort(A,q+1,r);
Merge(A,p,q,r);
}
}
int main()
{
//int a[]={8,1,4,6,5,2};
//InsertionSort(6,a);
ifstream cin;
ofstream cout;
//生成1000000以内的整数,50000个
cout.open("input.txt");
srand((unsigned)time(NULL));
double cost_time;
double starttime,endtime;
for(int i=0;i<=50000;i++)
{
cout<<rand()%(1000000)<<" ";
}
cout.close();
cin.open("input.txt");
for(int i=0;i<=50000;i++)
{
cin>>origin[i];
}
memcpy(origin2,origin,sizeof(origin));
cin.close();
cout.open("OutputInsection.txt");
starttime=(double)clock();
InsertionSort(50000,origin);
for(int i=0;i<=50000;i++)
{
cout<<origin[i]<<" ";
}
cout<<endl;
endtime=(double)clock();
cost_time=(endtime-starttime);
//输出小数点后3位,单位为秒
cout<<setiosflags(ios::fixed)<<setprecision(6)<<"插入排序花费了:"<<cost_time/1000000<<endl;
cout.close();
cout.open("OutputMerge.txt");
starttime=(double)clock();
MergeSort(origin2,0,50000);
for(int i=0;i<=50000;i++)
{
cout<<origin2[i]<<" ";
}
cout<<endl;
endtime=(double)clock();
cost_time=(endtime-starttime);
//输出小数点后3位,单位为秒
cout<<setiosflags(ios::fixed)<<setprecision(3)<<"归并排序花费了:"<<cost_time/1000000<<endl;
cout.close();
return 0;
}
如果你用的是VS2008/2010的话,需要将Merge函数里定义的L和R数组变成全局变量。否则会报错。
然后在函数里加入清零语句:
memset(L,0,sizeof(L));
memset(R,0,sizeof(R));