各种内部排序算法比较和选择
算法的简单性
第一类是简单算法,包括直接插入排序、简单选择排序和起泡排序,这些算法都比较简单和直接,易于理解。第二类算法是改进后的算法,包括折半插入排序、希尔排序、锦标赛排序、堆排序、快速排序和归并排序(归并排序可看作为对直接插入排序的另一种改进,它把记录分组排序,但分组的方法同希尔排序不同;另外,它把记录的插入和移动改为向另一个数组的复制),这些算法都比较复杂。第三类是基数排序,它不是基于排序码比较进行排序,而是另辟蹊径,通过一系列分配和收集来排序。
算法的性能分析
图示
图片来自:http://blog.chinaunix.net/uid-21457204-id-3060260.html
时间复杂度
就平均情况而言,直接插入排序、简单选择排序和起泡排序属于第一类,其时间复杂度为
O(n2)
;折半插入排序、堆排序、锦标赛排序、快速排序和归并排序属于第二类,其时间复杂度为
O(nlog2n)
;希尔排序介于这两者之间。
若从最好的情况考虑,则直接插入排序和起泡排序的时间复杂度最好,为
O(n)
,其他算法的最好情况同平均情况相同。
若从最坏的情况考虑,则快速排序的时间复杂度为
O(n)
,直接插入排序、希尔排序和起泡排序虽然同平均情况下相同,但是系数大约增加一倍,所以运行速度降低一半,最坏情况对简单选择排序(仅指比较次数)、锦标赛排序、堆排序、和归并排序影响不大。
若再考虑各种排序算法的时间复杂度的系数,则在第一类算法中,直接插入排序的系数最小,简单选择排序次之(但它的移动次数最小),起泡排序最大,所以直接插入排序和简单选择排序比起泡排序速度快;在第二类算法中,快速排序的系数最小,堆排序和归并排序次之,所以快速排序比堆排序和归并排序速度快。
由此可知,在最好的情况下,直接插入排序和起泡排序最快;在平均的情况下,快速排序最快;在最坏的情况下,锦标赛排序、堆排序、归并排序最快。
空间复杂度
第一类包括锦标赛排序排序和归并排序,其空间复杂度为 O(n) 。第二类是快速排序,其空间复杂度为 O(log2n) 。第三类包括其它算法,其空间复杂度为 O(1) 。由此可知,第三类算法的空间复杂度最好,第二类次之,第一类最差。
算法的稳定性
第一类是稳定的排序算法,包括直接插入排序,折半插入排序,起泡排序,归并排序,锦标赛排序和基数排序。第二类是不稳定的排序算法,包括希尔排序,简单选择排序,快速排序和堆排序。
适用问题的规模
设待排序元素序列的元素个数(问题规模)为n,则n越小,采用简单排序方法越合适;n越大,采用改进排序算法越合适。因为n越小, n2 同 nlog2n 的差距越小;而n越大, n2 和 nlog2n 的差距就越大。
元素本身的信息量
元素本身的信息量越大,表明占用的存储数量就越多,移动元素时所花费的时间就越多,所以对元素移动次数越多的算法不利。例如,在三中简单排序算法中,简单选择排序移动记录的次数为 O(n) ,其它两种为 O(n2) ,所以当元素本身的信息量较大的时候,对简单选择排序算法有利,而对其它两种算法不利。
结论
- 当倒排序元素个数n较大,且排序码分布较随机,对稳定性不做要求时,采用快速排序为宜。
- 当待排序元素个数n较大,内存空间允许,且要求排序结果稳定,采用归并排序或者锦标赛排序。
- 当待排序元素个数n较大,排序码分布可能会出现正序或者逆序的情况,且对稳定性不作要求时,则采用堆排序(或者归并排序)算法。
- 当待排序元素个数n较少,元素的初始排列基本有序(即正序)或者分布较随机,且要求稳定时,采用直接插入排序为宜。
- 当待排序元素个数n较小,对稳定性不做要求时,则采用简单选择排序为宜,若排序码不接近逆序,亦可以采用直接插入排序。
注:本文内容来自书籍《数据结构精讲与习题详解—考研辅导与答疑解惑》,殷人昆编著,清华大学出版社。仅供学习用