手写三种sort算法

来源:互联网 发布:数据恢复精灵 4.2.1 编辑:程序博客网 时间:2024/05/17 04:22

最近要找工作,于是手写了stl风格的三种sort算法,quick sort,merge sort和heap sort,其中quick sort分别实现了递归和非递归两种,代码如下,经过了基本的正确性测试(不保证对所有类型都正确,因为没充分测试过),然后性能测试与C++的std::sort和std::stable_sort做了一些对比代码如下:

 

 

进行了基本的测试之后与stl的std::sort,std::stable_sort进行了测试对比 

 

 

测试随机生成5000w数据,分别使用std::sort,std::stable_sort,以及自己实现的merge sort,heap sort,quick sort(递归与非递归的)进行了

对比编译使用g++ -O3优化,

 

运行的平台为:Linux 2.6.26-2-686-bigmem 16 Intel Unknown 2666MHz processors, 85340.50 total bogomips, 16223M

RAM System library 2.7.0

 

stable_sort time: 7.968942s

merge_sort_recursion time: 8.704957s

heap_sort time: 19.695442s

quick_sort_recursion time: 6.323566s

quick_sort_nonerecu time: 6.283994s

sort time: 5.778701s

 

可以看到heap sort最慢(可能是由于我实现的原因quick sort最快

 

stl的std::sort采用一种混合排序的策略,优化的比较好,因此比我实现的quick快一些还可以看到其实递归与非递归其实差别不大,

quick_sort_recursion和quick_sort_nonerecu在5kw数据下,相差还不到0.1s,因此谨慎怀疑glibc里面的qsort用栈展开是否有必要。

看了一下stl的std::stable_sort,貌似它用merge sort实现的时候,实现比我的方法好一些,因此运行速度也比我的merge sort快了接近1s。