首页 > 代码库 > 普林斯顿公开课 算法3-7:排序算法复杂度

普林斯顿公开课 算法3-7:排序算法复杂度

算法复杂度用来表示在解决某个问题时,算法的性能表现。


复杂度上限,就是某个具体的已经实现的算法能够保证在一定时间内解决问题

复杂度下限,就是通过数学方法证明,所有的算法都必须花费一定的时间才能解决问题

最优化算法,就是可能达到的最小复杂度的算法,通常介于复杂度上限和下限之间


比如排序问题中:

  • 计算模型为决策树

  • 使用比较次数作为开销依据

  • 复杂度上限:使用归并排序可以达到N lgN复杂度

  • 复杂度下限:?

  • 最优化算法:?


决策树举例


有三个不同的元素a b c,通过比较的方式来得出排序结果。那么它的决策树为下图所示:



树的高度代表了最差情况下需要比较的次数。

树的宽度代表了可能的排列顺序。


证明


命题


任何基于比较的排序算法在最坏情况下至少要lg(N!) 到 N lgN 次比较。


证明


  1. 假设数组由N个不同的值组成,从a1到an

  2. 最坏情况由决策树的高度决定

  3. 二叉树最多可能的叶子节点数是2^h

  4. 因为数组有N!中不同的排序方式,所以至少有N!个叶子节点


结论


  • 计算模型为决策树

  • 使用比较次数作为开销依据

  • 复杂度上限:使用归并排序可以达到N lgN复杂度

  • 复杂度下限:N lgN

  • 最优化算法:归并排序


归并排序从比较次数来说是所有排序算法中最少的,但是从内存占用方面来讲并不是最优的。


因此要用理论作为指导,不要试图设计一种比N lgN复杂度还要小的排序算法(基于比较的排序算法)。


在实际应用中,可能有时候已经知道输入的数组有些特殊的性质,比如数组有一部分已经经过排序了,数组大致已经排序,数组中有许多重复值等。所以在实际应用中可以依据输入数据的特殊性质来选择合适的排序算法。比如对于已经大致排序的数组,可以使用插入排序实现复杂度为N的排序。