C++抽象编程——算法分析(7)——快速排序算法分析

合并排序和Quicksort算法的实际运行时间的头对头比较如下图所示。Quicksort的这种实现往往比合并排序的执行速度快几倍,这是程序员在实践中更频繁地使用它的原因之一。此外,两种算法的运行时间似乎以大致相同的方式增长。

然而,上图所示的实证结果掩盖了重要的一点:只要Quicksort算法选择一个接近于向量中值的枢轴,分区步骤就会将向量划分成大致相等的部分。如果算法选择其枢轴值较差,则两个部分向量中的一个可能比另一个部分向量大得多,这违反了分治策略的目的。在具有随机选择的元素的向量中,Quicksort往往表现良好,平均情况下为O(N log N)。在最坏的情况下(这个矛盾的是由已经排序的向量组成 )性能退化为O(N^2)。尽管在最坏的情况下这种行为很差,但是Quicksort在实践中比大多数其他算法要快得多,它已经成为一般分类过程的标准选择。
我们可以使用几种策略来增加枢纽实际上接近向量中值的可能性。一个简单的方法是让Quicksort实现随机选择pivot元素。虽然随机过程仍然可能选择不良的枢轴值,但是在递归分解的每个级别都不太可能会发生相同的错误。此外,原始vector的分布总是不好的。 给定任何输入,随机选择枢轴确保该向量的平均情况性能为O(N log N)。另一种方法是从vector中选择一些值,通常为三或五个,并选择这些值的中位数作为枢轴。
当你尝试以这种方式改进算法时,你必须要小心谨慎。选择好的枢轴可以提高性能,但也花费一些时间。 如果算法花费更多的时间选择枢纽,但是却没能做出一个好的选择,你将最终减缓实现,而不是加快速度。

你可能感兴趣的:(抽象编程(C++),C++学习与基础算法)