首页 » 算法技术手册 » 算法技术手册全文在线阅读

《算法技术手册》分析

关灯直达底部

在理想情况下,切分操作平分原始数组,如果在每一次递归的时候都能够保持平分,那么性能将会和中值排序一样,而且不会有额外的性能开销。我们定义t(n),表示快速排序n个元素的数组所花费的时间。因为快速排序是递归的,所以我们能够认为:

t(n)=2*t(n/2)+O(n)

O(n)表示切分数组需要花费线性时间。第2章已经介绍过,如果一个算法能够用这样的t(n)来定义行为,那么其性能为O(n log n)。从大量实践的经验上来看,因为被抽象成为O(n)的常数比较小,快速排序要比中值排序快。快速排序的总开销也比较少,因为它不需要在构建子问题时寻找中值元素。实际上,在实践中,即使是随机选择中枢值也已足够,这样的话,在快速排序每一次递归的时候只需要进行一次切分操作(而中值排序需要递归地调用切分操作来寻找中值元素)即可。

最坏情况下,最大或者最小的元素被挑选成为中枢元素。当这种情况发生的时候,快速排序将会遍历一遍数组中所有的元素(线性时间),仅仅排序数组中的一个元素。在最坏情况下,这个过程将会重复n-1次,导致性能退化到O(n2)。