澄清Quicksort中的交换标准?

时间:2013-03-30 12:37:31

标签: algorithm sorting quicksort

在快速排序中,我们的想法是继续选择一个支点。并且您在左侧找到的值大于枢轴的值与您在右侧找到的值小于枢轴的值。见:ref

只是想100%确定在以下情况下会发生什么:

  • 左侧没有值大于枢轴,右侧值小于枢轴
  • 左侧的值大于枢轴,右侧的值小于枢轴
  • 左侧没有值大于枢轴,右侧没有值小于枢轴

2 个答案:

答案 0 :(得分:0)

虽然枢轴值的选择对性能很重要,但它对于排序并不重要。

一旦您选择了一些值作为枢轴,然后将所有小于或等于枢轴的值移动到枢轴的左侧,并且在它的右侧,您最终得到的所有值都大于枢轴。 / p>

在所有这些移动之后,枢轴值处于最终位置。

然后,您递归地重复上述过程为数组左侧的子数组以及它右侧的子数组。或者,如果子数组中有0或1个元素,则与它们无关,无需排序。

因此,通过这种方式,您最终会选择一组枢轴值,这些值在所有动作之后进入最终位置。在这些枢轴值之间是空的或单元素子阵列,不需要如前所述进行排序。

答案 1 :(得分:0)

交换标准取决于实施。你提到的三种情况会发生什么取决于分区方案。 Quicksort有很多实现,但主要的两个最着名的(在我看来)是:

  • Hoare的分区:第一个元素是数据透视图,两个索引变量(ij)将数组(a[])引向中心而他们遇到的元素小于/大于枢轴。然后交换a[j]a[i]。请注意,在此实现中,交换发生在等于pivot 的元素上。当您的数组包含许多相同的条目时,这被认为是很重要的。在ij交叉后,a[0]a[j]交换,因此数据透视在较小或相等的分区与较大或相等的分区之间分区。

  • Lomuto的分区。这是在" In-place version"下的当前Wiki快速排序条目中以伪代码实现的。这里的枢轴可以是任何东西(比如中位数,或三个中位数),并与a的最后一个元素交换。这里只有i"行走"在数组末尾:只要a[i]>=pivota[j]交换,j递减。最后,数据透视与a[i+1]

  • 交换

(例如,参见here)。

Robert Sedgewick对three way partitioning scheme进行了分析,其中数组被划分为三个分区:小于,等于和大于数据透视:声称它在具有大量欺骗的数组上具有更好的性能,或者相同的价值观它的实现方式不同(见上面的链接)。