我们编写一个计算(算法执行时间)的函数来测试算法的性能,(即本文性能把算法执行时间的长短作为标准)这里以排序函数为例作为被测函数
# include<iostream>
#include<ctime>
#include<cassert>
using namespace std;
template <typename T>
void selectionSort(T arr[],int n) /*排序算法,具体解释请看我之前的博文*/
{
for(int i=0;i<n;i++)
{
int minIndex=i;
for(int j=i+1;j<n;j++){
if(arr[j]<arr[minIndex])
{
minIndex=j;
}
}
swap(arr[i],arr[minIndex]);
}
}
int* generateRandomArray(int n,int rangeL,int rangeR)
{
assert( rangeL<=rangeR);
int * arr = new int[n]; //生成具有n个元素的数组
srand(time(NULL));
for(int i=0;i<n;i++)
{
arr[i]=rand()%(rangeR-rangeL+1)+rangeL; //随机生成数组里的各个元素值
}
return arr; //将数组返回
}
template<typename T>
bool isSorted(T arr[], int n) //测试数组内各值是否已经被选择排序
{
for(int i=0;i<n-1;i++)
{
if(arr[i]>arr[i+1])
return false;
}
return true;
}
template <typename T>
void testSort( string sortName, void(*sort)(T[],int ), T arr[], int n)//测试命名(读者可更改),被测试函数,测试用的数组,测试数组的元素个数
{
clock_t startTime =clock();
sort(arr,n);
clock_t endTime =clock();
assert(isSorted(arr,n));//断言assert,如果数组未被排序,则在此处终止程序。
cout<<sortName<<" : "<<double(endTime-startTime)/CLOCKS_PER_SEC<<" s"<<endl; //宏CLOCKS_PER_SEC 指的是每秒时钟运行周期的个数,适用于将计算机系统时间转化为用户可读的秒时间
return ;
}
int main()
{
int m=6000;
int * arr=generateRandomArray(m,0,m);
testSort("the first one:",selectionSort,arr,m );
delete[] arr;
return 0;
}
clock()是C/C++中的计时函数,而与其相关的数据类型是clock_t。
clock_t clock(void) ;
这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock);若挂钟时间不可取,则返回-1。其中clock_t是用来保存时间的数据类型。
注:在linux系统下,CLOCKS_PER_SEC的值可能有所不同,目前使用的linux打印出来的值是1000000,表示的是微秒。
可以看到每过千分之一秒(1毫秒),调用clock()函数返回的值就加1。