一、上代码
#include<bits/stdc++.h> using namespace std; #define MAXN 50000000 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 != t1.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->a; 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 != t1.b)return t1.b < t2.b; return t1.c <= t2.c; } }; TS tss[MAXN]; void gen(){ for(int i = 0;i < MAXN;++i){ tss[i].a = rand() * rand(); tss[i].b = rand() * rand(); tss[i].c = rand() * rand(); } } int main() { srand((unsigned)time(NULL)); gen(); clock_t st = clock(); sort(tss, tss + MAXN, cmp); printf("sort by function pointer:%ld\n", clock() - st); gen(); st = clock(); sort(tss, tss + MAXN, cmpFunctor()); printf("sort by functor:%ld\n", clock() - st); gen(); st = clock(); qsort(tss, MAXN, sizeof(tss[0]), cmp4qsort); printf("qsort by function pointer:%ld\n", clock() - st); return 0; }
二、在开-O2优化的情况下,计算结果:
三、从结果中可以看出,sort+比较器对象是最快的。sort次之,qsort最慢。在ACM中,如果时间限卡的比较紧,可以考虑这一个优化点。
参考自:《算法竞赛入门经典——习题和解答》,2018版。