排序算法总览
排序大的分类可以分为两种:内排序和外排序。在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序。下面讲的排序都是属于内排序。内排序有可以分为以下几类:
(1)、插入排序:直接插入排序、二分法插入排序、希尔排序。
(2)、交换排序:冒泡排序、快速排序。
(3)、选择排序:简单选择排序、改进的简单选择排序、堆排序。
(4)、归并排序
(5)、线性时间排序:基数排序、计数排序、桶排序
算法复杂度及稳定性分析:
平均情况下,快速排序最快;
最好情况下,直接插入排序和冒泡排序最快;
最坏情况下,堆排序和归并排序最快。
稳定排序:直接插入排序、冒泡排序、改进简单选择排序、归并排序、基数排序
不稳定排序:谢尔排序、快速排序、简单选择排序、堆排序
简单的排序算法:直接插入排序、冒泡排序、简单选择排序、改进简单选择排序、 (简单性:编写、阅读)
不简单排序算法:谢尔排序、快速排序、堆排序、归并排序、基数排序
若想选既稳定又高效的排序,选归并排序;
若不想通过关键字比较来排序,选基数排序;
当n较小时,可选简单的排序算法,易理解,容易编写;
当n较大时,应选高效的排序方法:只求快速,不顾稳定,选快速排序;若要稳定,则选归并排序。
(1)n较小,记录基本有序,要求稳定,直接插入排序或冒泡排序
(2)n较小,记录所含数据量大,数据项多,不要求稳定,简单选择排序
(3)n较大,关键字值分布较均匀随机,不要求稳定,快速排序
(4)n较大,关键字值分布可能出现正序或倒序,要求稳定,归并排序
(5)n较大,关键字值分布可能出现正序或倒序,不要求稳定,堆排序
(6)待排记录关键字值具有很好的结构特性,比如为r进制整数或字母构成,基数排序
(7)n较大,只需找出关键字值最小的前k个记录,简单选择排序或堆排序
(8)n较大,只需找出关键字值为第k大的记录,快速排序
常用排序算法的性能与待排数组的分布的关系作一个总结:
1)冒泡:无关;
2)选择:无关;
3)插入:有关,有序程度越大,比较越少;
4)shell:有关,它的基本思想基于插入排序;
5)合并:有关,有序程度愈大,合并过程的比较次数越少;
6)堆排序:有关,有序程度越大,建立堆下沉操作越少;
7)快排序:有关,如果选择最后值作为阀值,那么有序程度越好,就越可能退化成O(n^2);
无关,随机选择阀值,那么与排序程度无关。