排序函數效率

引用來自陳鋒《算法競賽入門經典習題與解答》

想對於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對象,這於陳鋒機器上測試結果也不同。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章