你们中的一些人可能偶然发现了这篇可爱的文章 - http://igoro.com/archive/quicksort-killer/ \
真正有趣的是他如何修复快速排序以在O(N log N)中对定义的对手执行。
快速排序可以选择中间元素作为每一步的枢轴,因此总是将输入序列完美地分成两半。在O(N)运行时间内可确定地找到中位数,因此总运行时间始终为O(N log N)。
我的问题是线性时间中值查找算法最终不会使用相同的比较函数并以O(N ^ 2)而不是O(N)执行?
编辑:
准确地说:我质疑基于分区的中值选择算法的复杂性,该算法使用类似于快速排序的策略,它将使用与快速排序使用的相同的比较功能。如何在这个对手的O(N)中发挥作用?
答案 0 :(得分:5)
不会是线性时间中位数发现 算法最终使用相同的 比较函数并在O(N ^ 2)中执行 而不是O(N)?
不,通过添加O(N)函数来找到中位数,复杂性变为
O((N+N) log N) == O(2N log N) == O(N log N)
但是,正如那篇文章所述,增加的常数使它没有吸引力。
标准技术被称为3的中位数,完整的中位数搜索不会真正改善。
如果最坏情况很严重,请不要使用Quicksort。 Shellsort有更好的上限。