您的位置:首页 > 其它

测试算法的性能(以选择排序为例)

2018-01-26 19:02 197 查看
 测试算法的性能
      很多时候我们需要对算法的性能进行测试,最简单的方式是看算法在特定的数据集上的执行时间,简单的测试算法性能的函数实现见testSort()。
【思想】:用clock_t计算某排序算法所需的时间,(endTime - startTime)/ CLOCKS_PER_SEC来表示执行了多少秒。
【关于宏CLOCKS_PER_SEC】:以下摘自百度百科,“CLOCKS_PER_SEC是标准c的time.h头函数中宏定义的一个常数,表示一秒钟内CPU运行的时钟周期数,用于将clock()函数的结果转化为以秒为单位的量,但是这个量的具体值是与操作系统相关的。”
【代码】:
SortTestHelper.h
#pragmaonce
#ifndefSELECTIONSORT_SORTTESTHELPER_H
#defineSELECTIONSORT_SORTTESTHELPER_H
 
#include<iostream>
#include<ctime>
#include<cassert>
usingnamespace std;
 
//把测试相关的函数放到新的命名空间里
namespaceSortTestHelper {
    //返回一个随机生成的数组(测试暂定义为int*类型)
    //生成有n个元素的随机数组,每个元素的范围为[rangeL, rangeR]
    int*generateRandomArray(intn,intrangeL,intrangeR){
 
        assert(rangeL <=rangeR);//确保左端点<=右端点
        int *arr =newint[n];
        srand(time(NULL));//将当前时间设置为随机种子
        for (int i = 0; i <n;
i++)
            arr[i]= rand() % (rangeR -rangeL + 1) +rangeL;
            //rand()对整个范围取余,再加上偏移量
        return arr;
    }
 
    //打印函数
    template<typenameT>
    void printArray(Tarr[],intn)
{
        for (int i = 0; i <n;
i++)
            cout<< arr[i]<<" ";
        cout<< endl;
    }
 
    //测试算法的正确性
    template<typenameT>
    bool isSorted(Tarr[],intn)
{
        for (int i = 0; i <n
- 1; i++)
            if (arr[i] >arr[i
+ 1])
                returnfalse;
        returntrue;
       
    }
 
    //测试算法性能
    template<typenameT>
    void testSort(stringsortName,void(*sort)(T[],int),Tarr[],intn)
{
        /*第一个参数:string sortName排序算法的名称
        第二个参数:void(*sort)(T[], int)是传入排序算法函数本身,即传入一个排序函数的指针(*sort)
        第三、四个参数: T arr[], int n传入测试用例
        */
        clock_t startTime =clock();
        sort(arr,n);
        clock_t endTime = clock();
 
        assert(isSorted(arr, n));//测试正确性
        //注意:assert函数不能放在计算endTime之前,否则时间就包含了验证正确性的时间
        cout<<sortName<<":"<<double(endTime
-startTime) / CLOCKS_PER_SEC<<"s"<< endl;
        //CLOCKS_PER_SEC每秒钟运行的时钟周期的个数(标准库中定义的宏)
        //运行的总时钟周期/每秒运行的时钟周期=运行的秒数
        return;
    }
 
   
}
 
#endif
 
主程序:
// SelectionSort.cpp: 定义控制台应用程序的入口点。
//
 
#include"stdafx.h"
#include<iostream>
#include<algorithm>
#include<string>
#include"Student.h"
#include"SortTestHelper.h"
usingnamespace std;
 
//泛型
template<typenameT>
 
voidselectionSort(Tarr[],intn)
{
    for (int i = 0; i <n;
i++) {
        //寻找(i, n)区间中的最小值及其所在位置
        int minIndex = i;//每次默认未排序部分的第一个为最小值
        for (int j = i + 1; j <n;
j++)
            if (arr[j] <arr[minIndex])
                minIndex= j;
 
        //交换
        swap(arr[i],arr[minIndex]);//老版中swap函数在algorithm库
 
       
    }
}
 
int main()
{
    int n = 10000;//随机数组的长度
    int *arr =SortTestHelper::generateRandomArray(n, 0, n);
    SortTestHelper::testSort("Selection Sort",selectionSort, arr, n);
 
    //在SortTestHelper中使用了new开辟了新的命名空间,此处释放,避免内存泄漏
    delete[] arr;//arr开的是数组空间,故用该方法释放
 
   return 0;
}
 
【运行截图】:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息