一、计算运行时间
在c++中,可添加<ctime>头文件来计算运行时间,一种简单的方法是定义两个数,如int start=clock(),int end=clock() ,则运行时间为t=end-start,可直接输出,如cout<<end-start, 注意显示的时间为毫秒。
二、生成随机数
在c++中,一般用rand()来生成随机数,可以这样写
#include<iostream>
using namespace std;
int main()
{
int a[100];
int i;
for(i=0;i<10;i++)
a[i]=rand();
for(i=0;i<10;i++)
cout<<a[i]<<endl;
return 0;
}
不过这样生成的是伪随机数,因为每次运行的结果都一样。这与srand()函数有关。srand()用来设置rand()产生随机数时的随机数种子。在调用rand()函数产生随机数前,必须先利用srand()设好随机数种子(seed), 如果未设随机数种子, rand()在调用时会自动设随机数种子为1。如果想要生成真正的随机数,则要对strand()进行设置,可以把系统时间设为随机数种子, srand( (unsigned)time( NULL ) ),这样srand()函数就产生一个以当前时间开始的随机种子,不过时间间隔要超过1秒。
#include<iostream>
#include<ctime>
using namespace std;
int main()
{
int a[100];
int i;
srand( (unsigned)time( NULL ) );
for(i=0;i<10;i++)
a[i]=rand();
for(i=0;i<10;i++)
cout<<a[i]<<endl;
return 0;
}
一个完整的程序,题目如下:
定义一个足够大的整型数组,并任意选择三种不同的排序算法对数组中的数据进行排序(按从小到大的顺序排序),记录每种算法的实际耗时,并结合数据结构中的知识对算法的时间复杂度分析进行说明。实验数据分两种情况进行比较:
1、数组中的数据随机生成;
2、数组中的数据已经是非递减有序。
这里运用到了随机数和运行时间
#include<iostream>
#include<ctime>
using namespace std;
const int MAX=10000000;
int n;
void bubble_sort(int a[])
{
int i,j;
int flag=1;
while(flag)
{
flag=0;
for(i=0;i<n-2;i++)
{
for(j=0;j<n-1-i;j++)
{
if(a[j]>a[j+1])
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
flag=1;
}
}
}
}
}
void insertion_sort(int b[])
{
int i,j,key;
for(j=1;j<n;j++)
{
key=b[j];
i=j-1;
while(i>=0&&b[i]>key)
{
b[i+1]=b[i];
i--;
}
b[i+1]=key;
}
}
void merge(int A[],int p,int q,int r)
{
int i,j,k;
int n1=q-p+1;
int n2=r-q;
int *L;
L=new int[n1+2];
int *R;
R=new int[n2+2];
for(i=1;i<=n1;i++)
L[i]=A[p+i-1];
for(j=1;j<=n2;j++)
R[j]=A[q+j];
L[n1+1]=MAX;
R[n2+1]=MAX;
i=j=1;
for(k=p;k<=r;k++)
{
if(L[i]<=R[j])
{
A[k]=L[i];
i++;
}
else
{
A[k]=R[j];
j++;
}
}
delete []L;
delete []R;
}
void merge_sort(int A[],int p,int r)
{
if(p<r)
{
int q=(p+r)/2;
merge_sort(A,p,q);
merge_sort(A,q+1,r);
merge(A,p,q,r);
}
}
int main()
{
cout<<"数据规模为:";
while(cin>>n&&n)
{
srand((unsigned int)time(NULL));
int flag=1;
int *a=new int [n];
int *b=new int [n];
int *c=new int [n];
for(int i=0;i<n;i++)
a[i]=b[i]=c[i]=rand();
/*
cout<<"*****************************************************************"<<endl;
for(i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
for(i=0;i<n;i++)
cout<<b[i]<<" ";
cout<<endl;
for(i=0;i<n;i++)
cout<<c[i]<<" ";
cout<<endl;
cout<<"*****************************************************************"<<endl;
*/
int start1_1=clock();
bubble_sort(a);
int end1_1=clock();
int start1_2=clock();
bubble_sort(a);
int end1_2=clock();
int start2_1=clock();
insertion_sort(b);
int end2_1=clock();
int start2_2=clock();
insertion_sort(b);
int end2_2=clock();
int start3_1=clock();
merge_sort(c,0,n-1);
int end3_1=clock();
int start3_2=clock();
merge_sort(c,0,n-1);
int end3_2=clock();
/*
cout<<"*****************************************************************"<<endl;
for(i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
for(i=0;i<n;i++)
cout<<b[i]<<" ";
cout<<endl;
for(i=0;i<n;i++)
cout<<c[i]<<" ";
cout<<endl;
cout<<"*****************************************************************"<<endl;
*/
cout<<" 随机生成 非递减有序"<<endl;
cout<<"冒泡排序用时: "<<(double)(end1_1-start1_1)<<"ms";
cout<<" "<<(double)(end1_2-start1_2)<<"ms"<<endl;
cout<<"插入排序用时: "<<(double)(end2_1-start2_1)<<"ms";
cout<<" "<<(double)(end2_2-start2_2)<<"ms"<<endl;
cout<<"归并排序用时: "<<(double)(end3_1-start3_1)<<"ms";
cout<<" "<<(double)(end3_2-start3_2)<<"ms"<<endl;
cout<<endl<<"数据规模为:";
}
return 0;
}