引用來自陳鋒《算法競賽入門經典習題與解答》
想對於C語言內置的qsort函數,C++提供的sort函數使用起來更方便,不需要做類型轉換。sort有兩種方式,一種是傳入一個functor對象,另一種是直接引入一個排序函數。測試代碼如下
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <ctime>
using namespace std;
#define _for(i,a,b) for (int i = (a); i < (b); ++i)
const int N = 1e7;
struct TS
{
int a, b, c;
};
inline bool cmp(const TS& t1, const TS& t2)
{
if (t1.a != t2.a) {return t1.a < t2.a;}
if (t1.b != t2.b) {return t1.b < t2.b;}
return t1.c <= t2.c;
}
int cmp4qsort(const void *a, const void *b)
{
TS *t1 = (TS*)a, *t2 = (TS*)b;
if (t1->a != t2->a) {return t1->a < t2->b;}
if (t1->b != t2->b) {return t1->b < t2->b;}
return t1->c - t2->c;
}
struct cmpFunctor
{
inline bool operator() (const TS& t1, const TS& t2)
{
if (t1.a != t2.a) {return t1.a < t2.a;}
if (t1.b != t2.b) {return t1.b < t2.b;}
return t1.c <= t2.c;
}
};
TS tss1[N], tss2[N], tss3[N];
void genData()
{
_for(i, 0, N)
{
tss1[i].a = rand();
tss1[i].b = rand();
tss1[i].c = rand();
tss3[i].a = tss2[i].a = tss1[i].a;
tss3[i].b = tss2[i].b = tss1[i].b;
tss3[i].c = tss2[i].c = tss1[i].b;
}
}
int main()
{
srand(time(NULL));
genData();
clock_t start = clock();
sort(tss1, tss1 + N, cmp);
printf("sort by funtion pointer : %ld\n", clock()- start);
start = clock();
sort(tss2, tss2 + N, cmpFunctor());
printf("sort by functor : %ld\n", clock() - start);
start = clock();
qsort(tss3, N, sizeof(tss3[0]), cmp4qsort);
printf("qsort by funtion pointer : %ld\n", clock() - start);
return 0;
}
Debug測試下
Release測試下
總計
平均統計下,在筆者的測試機器上,計算速度是qsort>sort傳入函數指針>sort使用functor對象,這於陳鋒機器上測試結果也不同。