测试算法的性能(以选择排序为例)
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;
}
【运行截图】:
很多时候我们需要对算法的性能进行测试,最简单的方式是看算法在特定的数据集上的执行时间,简单的测试算法性能的函数实现见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;
}
【运行截图】:
相关文章推荐
- java实现冒泡排序,选择排序,插入排序,快速排序(简洁版)及性能测试
- java实现各种排序算法(包括冒泡排序,选择排序,插入排序,快速排序(简洁版))及性能测试
- java实现冒泡排序,选择排序,插入排序,快速排序(简洁版)及性能测试
- 冒泡排序,选择排序,插入排序,快速排序的简单性能测试
- 直接插入排序,希尔排序,冒牌排序,选择排序基本性能测试
- 插入排序的性能测试对比(C与C++实现)
- 算法:选择排序
- 数据结构&算法实践—【排序|选择排序】选择排序
- 算法基础:排序(一)——选择排序、插入排序、Shell排序——Python实现
- 插入排序、选择排序的实现与性能比较
- 多个IoC容器适配器设计及性能测试和容器选择
- 基础算法(三)---选择排序(Java)
- 白话经典算法系列之四 直接选择排序及交换二个数据的正确实现
- 测试算法(性能)的工具类
- 智渔课堂官方免费教程二十八:Java排序算法之选择排序和冒泡排序
- 数据结构与算法之--简单排序:冒泡、选择和插入
- 基础算法学习(一)__几种排序:选择、插入、冒泡和快排
- 算法二之树形选择排序
- Mysql数据库服务器性能配置优化二 -- 文件系统及IO调度算法的选择
- 排序的选择算法