问答题 试为下列每种情况选择合适的排序方法:
(1)n=30,要求最坏情况下速度最快。
(2)n=30,要求既要快,又要排序稳定。
(3)n=1000,要求平均情况下速度最快。
(4)n=1000,要求最坏情况下速度最快且稳定。
(5)n=1000,要求既快又最省内存。
【正确答案】
【答案解析】和(2)这两个情况适合在n比较小的排序算法中选择,包括直接插入排序、折半插入排序、冒泡排序、简单选择排序。它们在最坏情况下的排序码比较次数和数据移动次数如下表所示。当n=30时,在最坏情况下简单选择排序速度最快。
简单排序方法 排序码比较次数 实例n=30 数据移动次数 实例n=30 稳定性
直接插入排序 n(n-1)/2 435 (n+4)(n-1)/2 493
折半插入排序 (n-1)+nlog 2 n 176 (n+4)(n-1)/2 493
冒泡排序 n(n-1)/2 435 3n(n-1)/2 1305
简单选择排序 n(n-1)/2 435 2(n-1) 58
在最坏情况下冒泡排序速度最慢。n=30时,在平均情况下,既快又稳定的排序方法是折半插入排序。最好情况下是直接插入排序和冒泡排序。 (3)(4)(5)这3种情况适用于n比较大的排序方法。包括快速排序、堆排序、归并排序和基数排序。它们的性能比较如下表所示。
平均情况(用大O表示),
n=1000
最坏情况(用大O表示),
n=1000
附加存储 稳定性
比较次数 实例 移动次数 实例 比较次数 实例 移动次数 实例 大O表示 实例
快速排序 nlog 2 n 9966 nlog 2 n 9966 n 2 10 6 n 2 10 6 log 2 n 10
堆排序 nlog 2 n 9966 nlog 2 n 9966 nlog 2 n 9966 nlog 2 n 9966 1 1
归并排序 nlog 2 n 9966 nlog 2 n 9966 nlog 2 n 9966 nlog 2 n 9966 n 1000
基数排序 n 1000 0 0 n 1000 0 0 n+rd 1000
从表可知,(3)要求平均情况下速度最快的是快速排序。(4)最坏情况下最快且稳定的是基数排序,但它不是基于排序码比较的算法,如果只考虑基于排序码比较的算法,要数归并排序了。(5)既快又省存储的是堆排序。