大话数据结构第九章读书笔记
排序分类
本章共有七种排序算法,按排序过程中借助的主要操作,分成以下几种:
- 插入排序类:直接插入排序,希尔排序
- 选择排序类:简单选择排序,堆排序
- 交换排序类:冒泡排序,快速排序
- 归并排序类:归并排序
从简单性来看,非为
- 简单算法:冒泡,简单选择,直接插入
- 改进算法:希尔(直接插入的升级),堆(简单选择的升级),归并,快速(冒泡的升级)
性能比较
排序方法 | 平均情况 | 最好情况 | 最坏情况 | 辅助空间 | 稳定性 |
---|---|---|---|---|---|
冒泡排序 | O( n2 ) | O(n) | O( n2 ) | O(1) | 稳定 |
简单选择排序 | O( n2 ) | O( n2 ) | O( n2 ) | O(1) | 稳定 |
直接插入排序 | O( n2 ) | O(n) | O( n2 ) | O(1) | 稳定 |
希尔排序 | O(nlogn)~O( n2 ) | O( n1.3 ) | O( n2 ) | O(1) | 不稳定 |
堆排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(1) | 不稳定 |
归并排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(n) | 稳定 |
快速排序 | O(nlogn) | O(nlogn) | O( n2 ) | O(logn)~O( n <script type="math/tex" id="MathJax-Element-12">n</script>) | 不稳定 |
总结分析
时间复杂度
从平均情况看,最后3种改进算法要胜过希尔排序,并远远胜于前3种简单算法。
从最好情况看,反而冒泡和直接插入排序更胜一筹,也就是说,如果排序总是基本有序,反而不应该考虑4种复杂的改进算法。
从最坏情况看,堆排序与归并排序又强过排序以及其他简单排序。
空间复杂度
归并排序强调要马跑得快,就得给马吃个饱。快速排序也有相应的空间要求,反而堆排序等却都是少量索取,大量付出,对空间要求是O(1)
。如果执行算法的软件所处的环境非常在乎内存使用量的多少时,选择归并排序和快速排序就不是一个很好的选择了。
稳定性
从稳定性来看,归并排序独占鳌头,对于非常在乎排序稳定性的应用中,归并排序是个好算法。
待排序数量
从待排序记录的个数来说,其记录个数n
越小,采用简单排序方法越合适。反之,n
越大,采用改进排序方法越合适。这也就是我们为什么要对快速排序优化时,增加了一个阈值,低于阈值时唤作直接插入排序的原因。
简单选择排序似乎没什么用,但是,如果记录的关键字本身信息量比较大(例如,关键字都是数十位的数字),此时表明其占用存储空间很大,这样移动记录所花费的时间越多,根据上表,此时简单选择排序就变得非常有优势,
原因在于它是通过大量比较后选择明确记录进行移动,有的放矢。
总之,从综合各项指标来说,经过优化的快速排序是性能最好的排序算法,但是不同的场合我们也应该考虑使用不同的算法来应对。