通过代码测试算法的性能--以排序算法为例

我们编写一个计算(算法执行时间)的函数来测试算法的性能,(即本文性能把算法执行时间的长短作为标准)这里以排序函数为例作为被测函数

# 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。

发布了7 篇原创文章 · 获赞 6 · 访问量 6247

猜你喜欢

转载自blog.csdn.net/yuxing_miao/article/details/80071446