改进的quicksort可以是O(n)最好的情况吗?

时间:2011-12-22 19:20:13

标签: java algorithm sorting big-o quicksort

一般认为,快速排序的最佳情况是O(nlogn),因为阵列每次分区大约一半。还有人说最坏的情况是n ^ 2阶,假设数组已经排序。

我们不能通过设置一个名为swap的布尔值来修改quicksort吗?例如,如果第一遍的位置没有初始交换,那么我们可以假设数组已经排序,因此不再对数据进行分区。

我知道修改后的冒泡排序通过检查交换来使用它,允许最好的情况是O(n)而不是O(n ^ 2)。这种方法可以应用于快速排序吗?为什么或为什么不呢?

3 个答案:

答案 0 :(得分:5)

你的做法有一个错误...... 例如,我们有一个这样的数组: 1243 5 678

我们的Pivot元素是5.第一次传递后没有交换(因为4和3都较小),但是数组没有排序。所以你必须开始划分它,这导致n log n。

答案 1 :(得分:2)

不,这对quicksort不起作用。在冒泡排序中,如果您在不进行任何交换的情况下执行数组传递,则会知道整个数组已排序。这是因为每个元素都与冒泡排序中的邻居进行比较,因此您可以推断整个数组在没有进行交换的任何传递之后进行排序。

在quicksort中并非如此。在快速排序中,将每个元素与单个枢轴元素进行比较。如果你在快速排序中没有移动任何东西的情况下经历整个过程,它只会告诉你元素是相对于枢轴排序的(小于枢轴的值在其左侧,值大于枢轴在右侧),而不是彼此。

答案 2 :(得分:0)

此外,除了完全排序的输入之外,还存在使用几乎已排序的数组获得O(n)行为的问题。

您可以更加努力地使您的方法有效,但我认为您不能使其违反O(n log n)边界。有证据表明,在最坏的情况下,基于比较的排序不能比O(n log n)更有效。