关于堆排序、归并排序、快速排序的比较,到底谁快
来源:互联网 发布:网络社区商业模式 编辑:程序博客网 时间:2024/04/29 06:47
看到有人在csdn发帖询问这个问题,故此整理一下大家的答案
刚开始学排序,有个深深的疑惑
看书上说,
堆排序 归并排序 快速排序
最坏时间 O(nlogn) O(nlogn) O(n^2)
最好时间 O(nlogn) O(nlogn) O(nlogn)
平均时间 O(nlogn) O(nlogn) O(nlogn)
辅助空间 O(1) O(n) O(logn)~O(n)
从数据看明显堆排序最好啊,可是为什么都说快速排序比较好,求详细解释。
有人说代码实现后,数据量足够大的时候,快速排序的时间确实是比堆排序短,等会我写完代码也实验下。
搜到解释是,对于数组,快速排序每下一次寻址都是紧挨当前地址的,而堆排序的下一次寻址和当前地址的距离比较长。
回答1:
种非平方级的排序:
希尔排序,堆排序,归并排序,快速排序
我测试的平均排序时间:数据是随机整数,时间单位是秒
数据规模 快速排序 归并排序 希尔排序 堆排序
1000万 0.75 1.22 1.77 3.57
5000万 3.78 6.29 9.48 26.54
1亿 7.65 13.06 18.79 61.31
堆排序是最差的。
这是算法硬伤,没办法的。因为每次取一个最大值和堆底部的数据(记为X)交换,重新筛选堆,把堆顶的X调整到位,有很大可能是依旧调整到堆的底部(堆的底部X显然是比较小的数,才会在底部),然后再次和堆顶最大值交换,再调整下来。
从上面看出,堆排序做了许多无用功。至于快速排序为啥比归并排序快,我说不清楚。
回答2:
谁说的快排好啊?我一般都用堆的,我认为堆好。
这个哪有谱啊,考察使用环境啊。不是只有时间代价一种衡量标准的,还有空间代价,LZ也有过栈溢出的经历,那不就是空间代价过高了嘛。改成别的办法还是避免不了空间代价。LZ自己不是也已经把空间待见列出来了嘛。
回答3:
具体问题具体分析,快速排序当数据量越大的时候越能体现出它的优势。
回答4:
我自己按照堆排序的算法思想实现了堆排序,写完后对照网上的代码,代码几乎是差不多的。
至于为何堆排序效率比希尔排序慢很多,我在上面帖子已经说了,是堆排序的算法缺陷造成无用功太多。(我把堆排序看成是高级排序中的冒泡排序,冒泡也是两两交换做了太多无用功所以最慢。)
贴下我实现的希尔排序和堆排序,你可以自己去运行比较。
回答5:
Mark一下, 有时间好好做一些实验,给出具体结果。
这里先说说的我的看法,希望实验能支持我的预测。
我认为,
1. 快排的时间复杂度是不稳定的,在最快情况下比归并排序慢的多。
2. 当数据量大时,充分优化的归并排序可比快速排序更快。其原因有
1). 归并排序对内存的访问是严格的顺序方式(3个2个源数组,1个目标数组,都是顺序放分),故cache的命中率比快排更高,从这点上,相同的内存读写操作,归并优于快排,当数组占用的空间大大超过cache的大小,则这一优势将更加明显。
2)普通写法的归并排序有2个缺点,如果改进,则可以提速。如果你的实验是基于最普通的版本,得到的结果是快排优于归并,而优化的归并排序的版本,其性能则可能反超快排。
2.1) 归并排序不是In place.需要将结果存储到临时缓冲区,然后在复制回来,这个过程可以优化掉。使用乒乓做法,在第i级归并过程,从buff1 归并到buff2,在i+1级归并过程,从buff2复制到buff1。
2.2) 2路归并排序的核心动作是比较2个对列的头元素那个更大,其比较结果是随机的,2个分支机会均等,CPU的分支预测算法不起作用,当预测失败,可大大降低程序性能,如果消除这个分支,可明显提高程序性能。
回答6:
楼主知道标准库的sort是怎么实现的么? 先快排,递归深度超过一个阀值就改成堆排,然后对最后的几个进行插入排序。
回答7:
1.快排的时间复杂度确实不稳定,极端情况是O(n^2),但是平摊下来是T(n*lg(n)),而归并是严格的O(n*log(n))。
2.快速排序比归并排序快。其原因有
1)快排对内存的访问是顺序方式(包括逆序),只有两个目标而且是同一个数组,故cache的命中率不会比归并低。特别是数组空间接近于cache大小时,这一优势将更加明显。
2)快排的内存写操作次数平摊下来是T(n*lg(n)/2),而归并的内存写操作次数是严格的O(n*log(n)),由于内存写操作开销比较大,所以对于随机数据快排优于归并。
快速排序、堆排序、归并排序比较:可参考
http://www.cnblogs.com/yanspecial/p/5551030.html
怎样在不消除递归的情况下防止栈溢出?可参考
http://blog.zhaojie.me/2009/03/tail-recursion-and-continuation.html
本文参考地址:http://bbs.csdn.net/topics/390554511
- 关于堆排序、归并排序、快速排序的比较,到底谁快
- 快排与堆排序、归并排序的比较
- 常见比较排序算法的实现(归并排序、快速排序、堆排序、选择排序、插入排序、希尔排序)
- 归并排序,堆排序,基数排序,希尔排序,快速排序,交换排序,选择排序和插入排序的总结和比较
- 快速排序、堆排序、归并排序简单比较
- 插入排序、冒泡排序、选择排序、快速排序、堆排序、归并排序算法比较
- 归并排序和快速排序的比较
- 归并排序和快速排序的比较
- 常见的三种排序算法(堆排、快排、归并排序)的比较总结
- 快速排序、堆排序、归并排序
- 快速排序、堆排序、归并排序
- 快速排序、归并排序、堆排序
- 快速排序、堆排序、归并排序
- 快速排序、堆排序、归并排序
- 归并排序、快速排序、堆排序
- 堆排序、归并排序、快速排序总结
- 归并排序、堆排序、快速排序
- 快排和归并排序的比较
- Kettle简介和安装
- 艺术编程-技术之声第13期
- ghost主题qianxun-themes
- 慕课网-spring-mvc学习
- 网络环境介绍
- 关于堆排序、归并排序、快速排序的比较,到底谁快
- Ubuntu14.04 常用软件安装
- 2017蓝桥杯模拟 风险度量(并查集)
- Ghost 开源博客使用七牛、又拍云、阿里云OSS云储存
- 水平ScrollView
- 使用onresume实现finish返回刷新数据
- 好雨云帮如何对接Git Server
- python爬虫——beautifulsoup4使用学习
- matplotlib