之前介绍过常见的排序算法,可以查看这里
之前实现的代码都是针对int型的算法,现在我将代码改写成了模板,这样可以应用于常见的一些类型。
为了测试比较不同的排序算法,采用了两种计时方式。注意,下面的两段代码中,void(*_sort[])(T*,int) 是函数指针数组。
1. 采用clock函数,统计排序算法所使用的时钟数
代码如下:
template <class T>
void clock_test()
{
void(*_sort[])(T*,int)={insert_sort,binary_insert_sort,shell_sort,shell_sort2,select_sort,
select_sort2,select_sort3,heap_sort,bubble_sort,bubble_sort2,quick_sort,
merge_sort,merge_sort2,merge_sort3,merge_sort4,rank_sort,rank_sort2};
int len=sizeof(_sort)/sizeof(_sort[0]);
clock_t start,finish;
// cout<<CLOCKS_PER_SEC<<endl;
cout<<"鐩存帴鎻掑叆\t鎶樺崐鎻掑叆\t甯屽皵鎺掑簭\t"<<endl;
int step=100;
for(int k=100;k<=100000;k+=step)
{
const int N=k;
T arr[N];
double tm[N];
// srand(time(0));
for(int i=0;i<N;i++)
arr[i]=rand()%1000;
for(int i=0;i<len;i++) {
start=clock();
_sort[i](arr,N);
finish=clock();
tm[i]=(finish-start)*1.0/CLOCKS_PER_SEC;
}
cout<<k<<'\t';
for(int i=0;i<len;i++)
cout<<tm[i]<<'\t';
cout<<endl;
}
}
void clock_test()
{
void(*_sort[])(T*,int)={insert_sort,binary_insert_sort,shell_sort,shell_sort2,select_sort,
select_sort2,select_sort3,heap_sort,bubble_sort,bubble_sort2,quick_sort,
merge_sort,merge_sort2,merge_sort3,merge_sort4,rank_sort,rank_sort2};
int len=sizeof(_sort)/sizeof(_sort[0]);
clock_t start,finish;
// cout<<CLOCKS_PER_SEC<<endl;
cout<<"鐩存帴鎻掑叆\t鎶樺崐鎻掑叆\t甯屽皵鎺掑簭\t"<<endl;
int step=100;
for(int k=100;k<=100000;k+=step)
{
const int N=k;
T arr[N];
double tm[N];
// srand(time(0));
for(int i=0;i<N;i++)
arr[i]=rand()%1000;
for(int i=0;i<len;i++) {
start=clock();
_sort[i](arr,N);
finish=clock();
tm[i]=(finish-start)*1.0/CLOCKS_PER_SEC;
}
cout<<k<<'\t';
for(int i=0;i<len;i++)
cout<<tm[i]<<'\t';
cout<<endl;
}
}
部分测试输出如下:
2. 利用ftime函数,具体介绍见这儿
代码如下:
template <class T>
void time_test()
{
void(*_sort[])(T*,int)={insert_sort,binary_insert_sort,shell_sort,shell_sort2,select_sort,
select_sort2,select_sort3,heap_sort,bubble_sort,bubble_sort2,quick_sort,
merge_sort,merge_sort2,merge_sort3,merge_sort4,rank_sort,rank_sort2};
int len=sizeof(_sort)/sizeof(_sort[0]);
struct TIMEB ts1,ts2;
time_t t_sec,t_ms,ti;
cout<<"鐩存帴鎻掑叆\t鎶樺崐鎻掑叆\t甯屽皵鎺掑簭\t"<<endl;
int step=100;
for(int k=100;k<=100000;k+=step)
{
const int N=k;
T arr[N];
double tm[N];
for(int i=0;i<N;i++)
arr[i]=rand()%1000;
cout<<k<<'\t';
for(int i=0;i<len;i++) {
ftime(&ts1);
_sort[i](arr,N);
ftime(&ts2);
t_sec=ts2.time-ts1.time;
t_ms=ts2.millitm-ts1.millitm;
ti=t_sec*1000+t_ms;
cout<<ti<<'\t';
}
cout<<endl;
}
}
void time_test()
{
void(*_sort[])(T*,int)={insert_sort,binary_insert_sort,shell_sort,shell_sort2,select_sort,
select_sort2,select_sort3,heap_sort,bubble_sort,bubble_sort2,quick_sort,
merge_sort,merge_sort2,merge_sort3,merge_sort4,rank_sort,rank_sort2};
int len=sizeof(_sort)/sizeof(_sort[0]);
struct TIMEB ts1,ts2;
time_t t_sec,t_ms,ti;
cout<<"鐩存帴鎻掑叆\t鎶樺崐鎻掑叆\t甯屽皵鎺掑簭\t"<<endl;
int step=100;
for(int k=100;k<=100000;k+=step)
{
const int N=k;
T arr[N];
double tm[N];
for(int i=0;i<N;i++)
arr[i]=rand()%1000;
cout<<k<<'\t';
for(int i=0;i<len;i++) {
ftime(&ts1);
_sort[i](arr,N);
ftime(&ts2);
t_sec=ts2.time-ts1.time;
t_ms=ts2.millitm-ts1.millitm;
ti=t_sec*1000+t_ms;
cout<<ti<<'\t';
}
cout<<endl;
}
}
部分测试输出如下:
最终的全部代码如下:
}