排序问题可以看做如下。
输入: n个数字的序列< a 1 , a 2 ,。 。 。 ,一个n >。
输出:一个置换(重排序) ‘1,A’ 2,。 。 。中, ‘N>输入序列的,使得一个‘ 1 <= A ‘2 … .. <= A’ N。
排序算法是如果它使用运算符找到两个数字之间的顺序根据比较。可以从决策树的角度抽象地比较比较类别。决策树是一个完整的二叉树,它表示元素之间的比较,这些元素之间的比较是由对给定大小的输入进行操作的特定排序算法执行的。排序算法的执行对应于跟踪从决策树的根到叶的路径。在每个内部节点处,进行a i <= a j的比较。然后,左子树指示i <= a j的后续比较,右子树指示i > a j的后续比较。当我们来到一片叶子时,排序算法已经建立了排序。因此,我们可以说一下决策树。
1)每个n ! n个元素上的排列必须作为决策树的叶子之一出现,以使排序算法能够正确排序。
2)令x为排序算法中的最大比较数。决策树的最大高度为x。具有最大高度x的树最多具有2 ^ x个叶子。
结合以上两个事实,我们得到以下关系。
n! <= 2^x
Taking Log on both sides.
log2(n!) <= x
Since log2(n!) = Θ(nLogn), we can say
x = Ω(nLog2n)
因此,任何基于比较的排序算法都必须至少进行nLog 2 n个比较才能对输入数组进行排序,并且Heapsort和merge排序是渐近最优的比较排序。
参考:
算法简介,作者:托马斯·H·科门(Thomas H. Cormen),查尔斯·E·雷森(Charles E. Leiserson),罗纳德·里维斯特(Ronald L.Rivest)和克利福德·斯坦(Clifford Stein)