比较排序算法

来源:互联网 发布:苹果手机编程软件 编辑:程序博客网 时间:2024/06/05 02:56

比较排序:在排序的最终结果中,各元素的次序依赖于他们之间的比较。我们把这类算法称为比较排序

比较排序的下界

               在一个比较排序算法中,我们只使用元素间的比较来获得输入序列<a1, a2, ....., an>中的元素间次序信息。也就是说,给定两个元素ai, aj ,可以执行ai<aj 、ai<=aj、ai=aj、ai>aj、ai>=aj中的比较操作来确定他们之间的相对次序。我们不能使用其他方法观察元素的值或者他们之间次序的信息。

         我们不妨假设所有的输入元素都是互异的。给定这个假设以后ai=aj 的比较就没有意义了。因此我们假设不需要这种比较。同时注意到 ai<aj  、ai>=aj  和ai<ajai>aj   都是等价的,因为通过他们所得到的关于ai  和aj  的相对次序信息是相同的。这样又可以进一步假设所有的比较采用的都是 ai<aj 形式。

决策树模型:

         比较排序可以抽象为一颗决策树。决策树是一颗完全二叉树。在决策树中,每个内部节点都以 i : j 标记。每一个内部节点表示一次比较 。左子树表示一旦确定  之后的后续比较,右子树则表示在确定了  之后的后续比较。当到达一个叶节点时,表示排序算法已经确定了一个顺序。

         最坏情况的下界:在决策树中,从根节点到任意一个可达叶节点之间最长简单路径的长度,表示的是对应的排序算法中最坏的情况下的比较次数。因此,一个排序算法中的最坏情况比较次数就等于其决策树的高度。同时,当决策树中每种排列都是以可达叶结点的形式出现时,该决策树高度的下界也就是比较排序算法运行时间的下界。

定理:在最坏情况下,任何比较排序算法都需要做次比较

推论:堆排序和归并排序都是渐进最优的比较排序算法。(堆排序与归并排序的运行时间上界为O(nlgn),这与定理给出的最坏情况下的下界是一致的)



几种比较排序算法的比较及适用情况

为了完整性,列出了其他的排序,其中比较排序包括:插入排序、冒泡排序、归并排序、堆排序、快排

时间复杂度比较:


                        线性排序时间复杂度为O(n)

稳定性(in stable)比较
插入排序冒泡排序、二叉树排序、二路归并排序及其他线形排序是稳定的。
选择排序、希尔排序、快速排序堆排序是不稳定的。



 辅助空间的比较
线形排序、归并排序的辅助空间为O(n)

快速排序的辅助空间为O(logn),其它排序的辅助空间为O(1)
 其它比较
插入、冒泡排序的速度较慢,但参加排序的序列局部或整体有序时,这种排序能达到较快的速度反而在这种情况下,快速排序慢了。

当n较小时,对稳定性不作要求时宜用选择排序,对稳定性有要求时宜用插入或冒泡排序。
若待排序的记录的关键字在一个明显有限范围内时,且空间允许时用桶排序。
当n较大时,关键字元素比较随机,对稳定性没要求宜用快速排序。
当n较大时,关键字元素可能出现本身是有序的,对稳定性有要求时,空间允许的情况下宜用归并排序。
当n较大时,关键字元素可能出现本身是有序的,对稳定性没有要求时宜用堆排序。

0 0