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