快速排序(Quick sort)

来源:互联网 发布:网络免费打电话哪个好 编辑:程序博客网 时间:2024/06/02 17:33

在《编程珠玑》中看到作者的的quick sort的速度介于C的qsort和C++的sort之间。
经过3次调优之后始终比C++的sort慢。我在作者的基础上又进行了若干次调优后,
速度和C++的sort基本持平。

所作的改变是将数组版改成指针版,这使速度得到明显的提升。
显然指针效率更高!

我只使用递归版本,因为在我的机器上递归版本和迭代版本没有明显差异,
原因可能有两个:(1)打开编译器优化开关后,编译器将尾部递归自动转成迭代;
(2)1百万个元素排序至多递归40次,开销不大。

我测试用的系统是:
OS:       fedora 11(kernel:2.6.29.4-167.fc11.i686.PAE)
Compiler: g++ (GCC) 4.4.0 20090506 (Red Hat 4.4.0-4)
Memory:   2G
CPU:      Intel(R) Core(TM)2 Duo CPU     E7500  @ 2.93GHz


程序编译:
1 使用 STL sort 版本:
    g++ -g -O2 -W -Wall -Wextra -o mytest -DUSE_STLSORT main.cpp

2 使用我的 quick sort 版本:
    g++ -g -O2 -W -Wall -Wextra -o mytest main.cpp

如果要看结果,编译时加 -DCOLL_PRINT 选项(打开此选项速度会变慢很多)。


程序执行:
命令 time ./mytest查看程序执行所用时间。

平均时间两者都在0m0.115s左右!

下面是代码, 我只将最后的版本贴在这里,你可以自己改回数组版,看看速度的差异:

//////////////////////////////////////////////////////////////////////////////////////

main.cpp:

// 2010年 10月 11日 星期一 09:29:26 CST
// author: 李小丹(Li Shao Dan) 字 殊恒(shuheng)
// K.I.S.S
// S.P.O.T
// for test sort

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <algorithm>

using namespace std;

#define MAX_NUMBER 1000000
#define MAX_VALUE 6000000
#define SORT_THRESHOLD 48

//#define USE_STLSORT
//#define COLL_PRINT

#ifndef USE_STLSORT
static void quick_sort(int *, int *);
static void insert_sort(int *, int *);
#endif

#ifdef COLL_PRINT
static void print_coll(int *, int);
#endif

int main()
{
    srand(time(0));
    int *coll = new int[MAX_NUMBER];
    for(int i = 0; i < MAX_NUMBER; ++i)
        coll[i] = rand() % MAX_VALUE;

#ifdef USE_STLSORT
#warning Use STL sort

    sort(coll, coll + MAX_NUMBER);

#else
#warning Use my sort

    quick_sort(coll, coll + MAX_NUMBER);
    //insert_sort(coll, coll + MAX_NUMBER);

#endif

#ifdef COLL_PRINT
    print_coll(coll, MAX_NUMBER);
#endif

    delete [] coll;
    return 0;
}


#ifndef USE_STLSORT

#define SWAP(a, b, t)    (t) = (a); (a) = (b); (b) = (t);
static void quick_sort(int *bp, int *ep)
{
    int n = ep - bp;
    if(n > SORT_THRESHOLD) {
        int t;
        int *qp = bp + (n >> 1);
        SWAP(*bp, *qp, t)

        int qv = *bp;
        int *p = bp;
        for(int *q = ep - 1;; ++p, --q) {
            for(; *p < qv && p < ep; ++p) ;
            for(; *q > qv && q >= bp; --q) ;
            if(p > q)
                break;
            SWAP(*p, *q, t)
        }
        quick_sort(bp, p);
        quick_sort(p + 1, ep);
    } else {
        insert_sort(bp, ep);
    }
}

static void insert_sort(int *bp, int *ep)
{
    int tmp;
    for(int *p = bp + 1, *q; p < ep; ++p) {
        tmp = *p;
        q = p - 1;
        for(; tmp < *q && q >= bp; --q)
            *(q + 1) = *q;
        *(q + 1) = tmp;
    }
}
#endif

#ifdef COLL_PRINT
static void print_coll(int *v, int l)
{
    for(int i = 0; i < l;) {
        cout << v[i] << '/t';
        if(!(++i % 10))
            cout << endl;
    }
}
#endif

原创粉丝点击