算法导论-排序

        排序被认为是算法研究中最基础的问题。常说的排序算法有插入排序、归并排序、堆排序、快速排序、计数排序、基数排序和桶排序。

        其中插入排序、归并排序、堆排序和快速排序都是通过比较完成排序的。我们称这类排序为比较排序。算法导论中给出了相关证明:比较排序的最坏情况都要讲过nlgn次比较。因此归并排序和堆排序是渐进最优的,并且已知的比较排序最多就是在常数因子上超过了它们。

        其中计数排序、基数排序和桶排序都属于线性时间排序,这类排序不是通过比较来进行排序的。因此下界nlgn不适用于它们。


1.插入排序

算法导论-排序

   最坏情况下时间复杂度为n2,由于插入排序的内层循环紧凑,因此对于小规模的输入是一种非常快的原址排序方法。

(如果输入数组中仅有常数个元素要在排序中存储在数组之外,则称算法为原址的。我的理解:这是基于Cache命中给出的简易解释。)

2.归并排序

具体算法在《算法导论-分治法》中有介绍。归并排序较插入排序有更好的渐进运行时间nlgn,但是由于Merger过程不是原址的

3.堆排序

堆排序的时间复杂度是nlgn,但与归并排序不同,堆排序属于原址排序。“堆”是一种数据结构,这一词就是源于堆排序,但是目前被很多地方使用,且意思也发生了变化。

(1)“堆”是什么:

算法导论-排序

算法导论-排序

        在堆排序算法中,通常使用最大堆,而最小堆主要用于构造优先队列。

(2)堆排序

算法导论-排序

算法导论-排序

算法导论-排序

4.快速排序

与归并排序一样,快速排序利用了分治的思想。下列是对一个数组A[p,r]进行快速排序的三步分治过程:

算法导论-排序

算法导论-排序

举例子说明如下:

算法导论-排序

5.计数排序

算法导论-排序算法导论-排序算法导论-排序

6.基数排序

  算法导论-排序

算法导论-排序

算法导论-排序

7.桶排序

算法导论-排序

算法导论-排序


算法导论-排序