排序函数效率

引用来自陈锋《算法竞赛入门经典习题与解答》

想对于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对象,这于陈锋机器上测试结果也不同。

发布了51 篇原创文章 · 获赞 19 · 访问量 8301

猜你喜欢

转载自blog.csdn.net/WxqHUT/article/details/98375259