算法自学笔记:排序算法复杂度

对于依靠比较进行排序的排序算法,判定其时间复杂度一个重要依据为需要的比较次数。
时间上限(upper bound 用O表示):某一特定算法解决问题的时间复杂度,如插入排序时间上限为O(N²),归并排序时间上限为O(NlogN)
时间下限(lower bound 用Ω表示):对于解决该问题的所有算法可能达到的最优时间复杂度。
最优算法 (optimal algorithm 用θ表示):实现以时间下限的复杂度解决该问题的算法,对于该算法O(X) = Ω(X) = θ(X)

证明所有依靠比较进行排序的算法时间下限:
排序算法要求各元素比较规则必须为全序关系
算法自学笔记:排序算法复杂度_第1张图片
如图,对于a b c 三个元素的排序,最多需要3次比较操作,即为树的高度。

对于N个元素(假设无重复)的排序,一共有N!种排列方式,也就意味着决策树必须有N!个节点,如果节点数小于N!就意味着部分情况被该算法遗漏,排序失败。

对于一个高度为h的二叉树,其节点数最大为2 ^ h。因此对于N!个元素需要构造比较树最小高度为logN!

根据斯特灵公式(Stirling’s formula):logN! ~ NlogN

综上所述,排序算法时间下限为Ω(NlogN),这说明不可能实现最糟情况时间复杂度低于NlogN的基于比较的排序算法,这一结论可以让我们节约资源不去进行不可能实现的性能改进。

因为归并排序时间复杂度为O(NlogN),因此可以说归并排序是在所有依靠比较进行排序的排序算法里时间最优算法。但是在空间方面归并排序不是最优的,因为很多其他排序算法,如选择排序为原地排序,而归并排序需要O(N)的额外空间

不过该时间下限也有一定局限性:
1 该下限仅限于最糟情况,输入数据初始排序会影响排序算法的时间复杂度,如在输入数组有序时,插入排序可以达到线性时间复杂度
2 只有在所有元素不等时才一定有N!中排列,当数据有较多重复时可以提供排序速度
3 除了依靠比较各元素大小,还有其他排序方法

你可能感兴趣的:(算法自学笔记,算法,数据结构,排序算法,排序,合并排序)