快速排序(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
- 快速排序 Quick Sort
- 快速排序(Quick sort)
- quick sort 快速排序
- 快速排序(Quick Sort)
- 快速排序(Quick Sort)
- Quick Sort (快速排序)
- 快速排序(Quick-Sort)
- 快速排序Quick sort
- 快速排序 (Quick Sort)
- 快速排序(Quick Sort)
- Quick Sort 快速排序
- 快速排序(quick sort)
- 快速排序 quick sort
- 快速排序 quick sort
- 快速排序 quick sort
- Quick Sort快速排序
- 快速排序(quick-sort)
- quick sort 快速排序
- Reactor与proActor异同
- Base64编码
- FLEX高级表格MecGrid
- Oracle 修改字段类型
- 普通内容转换成HTML的函数
- 快速排序(Quick sort)
- 最原始的AJAX
- oracle中简单的sql执行的表、序列、触发器
- java中进度条不能更新问题的研究
- 电流与铜厚度和宽度的关系
- textarea标签的innerHTML和innerText
- 创建并使用oracle全文搜索
- 指针数组、数组指针
- android linux 基础知识总结