1
算法与数据结构  C语言版
1.10.6 8.6 内部排序方法的比较和选择
8.6 内部排序方法的比较和选择

事实上,目前还没有十全十美的排序算法,有优点就会有缺点,即使是快速排序法,也只是在整体性能上优越,它也存在排序不稳定、需要大量辅助空间、对少量数据排序无优势等不足。因此我们来从多个角度来剖析一下提到的各种排序的长与短。将多种算法的各种指标进行对比,如表8-1所示。

表8-1 排序算法比较

从算法的简单性来看,我们将七种算法分为两类:

(1)简单算法:冒泡、简单选择、直接插入。

(2)改进算法:希尔、堆、归并、快速。

从平均情况来看,显然后三种改进算法要胜过希尔排序,并远远胜过前三种简单算法。

从最好情况看,冒泡和直接插入排序要更胜一筹,也就是说,如果待排序序列总是基本有序,反而不应该考虑四种复杂的改进算法。

从最坏情况看,堆排序与归并排序又强过快速排序以及其他简单排序。

从空间复杂度来说,归并排序强调要马跑得快,就得给马吃个饱。快速排序也有相应的空间要求,反而堆排序等却都是少量索取,大量付出,对空间要求是O(1)。如果执行算法的软件所处的环境非常在乎内存使用量的多少时,选择归并排序和快速排序就不是一个较好的决策了。

从稳定性来看,归并排序独占鳌头,我们前面也说过,对于非常在乎排序稳定性的应用中,归并排序是个好算法。

从待排序记录的个数上来说,待排序的个数n越小,采用简单排序方法越合适。反之,n越大,采用改进排序方法越合适。这也就是我们为什么对快速排序优化时,增加了一个阈值,低于阈值时换作直接插入排序的原因。

综上所述,在本章讨论的所有排序方法中,没有哪一种是绝对最优的。有的适用于n较大的情况,有的适用于n较小的情况,有的……因此,在实用时需根据不同情况适当选用,甚至可将多种方法结合起来使用。