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

 测试算法的性能

      很多时候我们需要对算法的性能进行测试,最简单的方式是看算法在特定的数据集上的执行时间,简单的测试算法性能的函数实现见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;

}

 

【运行截图】:


©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页