我正在阅读java中的DualPivotQuicksort类的实现细节。
就算法而言,它肯定是Quicksort的变体,虽然没有意义的是在枢轴选择中引入随机性的方式,因此确保算法在中运行预期 O(n lg(n))的运行时间。
我引用了几篇论文,但他们或多或少地解释了算法,而不是解决如何为枢轴选择处理随机性或者不是非常明确的:
答案 0 :(得分:4)
您不会说哪个 Java实现,因此我假设您指的是java.util.DualPivotQuicksort
。
那个班级没有选择随机支点。实际上,它从子阵列中挑选7个等距离的候选枢轴,对它们进行排序,并使用第3和第5个作为(双)枢轴。
例外:
byte
的数组进行排序。(注意:这是基于Java 7/8中的实现)
答案 1 :(得分:1)
简单的Quicksort实现的最坏情况发生在输入已经为您的数据透视策略排序时,就像选择数据透视作为子数组的第一个元素一样,如果您的元素是已经有序了。因为我们经常对数组进行排序,这些数组主要是排序"首先,通过随机化枢轴选择,您可以在实践中更接近预期的运行时间。
理想情况下,您想要选择一个可以均匀分区子问题的轴,有几种变体可以选择一个随机元素。另一个,我见过的另一个策略是采样数组,然后使用中位数。 (编辑:从另一个答案来看,看起来DualPivotQuicksort实际上是这种样式,有7个样本点,然后分成三个分区。这种方法没有随机性,而是采样。)
最后,这就是为手头的特定任务找到最快或最有效的变体。如果您有关于所排序内容的基础结构的更多信息,则可以定制算法的变体,以便在数据集上更加成功。在图书馆中,您希望通常快速但在面对误用"时可预测。这就是为什么在这样已经排序过的数组上具有良好性能的方法是一个很好的选择。