即使分区()之后的枢轴的最终位置不是它在排序数组中的位置,Hoare的快速排序如何工作?

时间:2017-09-09 12:33:04

标签: sorting quicksort

所有变量名都来自Quicksort's wikipedia page的Lomuto&和Hoare的快速排序伪代码。

如果ppartition函数返回的内容,则Hoare将其数组从lo分为p,从p+1分割为hi },而Lomuto将他的数组从lo分为p-1,从p+1分为hi

我可能错了,但Quicksort的哲学是......

  1. 在子阵列(枢轴)中取一个元素。
  2. 重新排列子阵列,使得枢轴左侧的所有元素都小于枢轴,并且枢轴右侧的所有元素都大于枢轴。
  3. 将数组划分为数据透视表。对两个较小的子子阵列重复此过程。继续这样做,直到遇到只有一个或更少元素的数组,因为它已经排序了。
  4. 我觉得Hoare的partition比Lomuto更容易理解。 Hoare的分区只是指示我们从左端和右端开始并继续朝着彼此移动。如果左标记遇到大于枢轴的元素,则左标记暂停,并等待右标记找到小于枢轴的元素。然后他们交换元素,使左标记具有较小的元素,右标记具有较大的元素。他们一直这样做,直到他们相遇。非常直截了当。

    Lomuto的partition,可以被认为是一种蛇,由两部分组成,头部和尾部。枢轴是固定的(我通常将最后一个元素作为Lomuto的枢轴)。蛇从左侧开始,并在最后一个元素之前停止。当蛇遇到小于枢轴的元素时,该元素到达尾部并且尾部的长度增加。当发现大于枢轴的元素时,该元素将进入蛇的头部。最后,枢轴放置在尾部和头部之间。它非常清晰但不像Hoare的partition那样直观或有效(在某些情况下)。

    让我感到困惑的是,Hoare的分区并没有确保partition之后枢轴的位置已经完成,将是它在决赛中的位置,排序数组。我在Hoare分区中唯一可识别的模式是i位于数据透视的最终位置,而jii-1ji是左右标记。

    然而,Lomuto的分区保证了它。因此,当我退后一步看看更大的图片时,Lomuto将数组从lo分割为p-1和从p+1分割为hi是有意义的。但是,我无法理解 Hoare如何将他的阵列从lo分割为p以及从p+1分割为hi,以弥补他的分区而不是把它的支点放在合适的位置。

1 个答案:

答案 0 :(得分:0)

我一直在通过Hoare的快速搜索方式查看示例和排序数组。我想我在Hoare的分区算法中发现了另一种有趣的模式。这可以解释为什么Hoare的方法有效。 Lomuto将数组划分为三个部分;元件小于枢轴,枢轴,元件大于枢轴。我认为Hoare以不同的方式看待事物。他将数组划分为两个部分;小于枢轴的元素,元素等于或大于数据透视。其中一个陷阱是Lomuto的分区返回了枢轴的最终位置,而Hoare的分区返回了枢轴最终位置之前的位置。这就是为什么Lomuto会从lo快速排序到p-1,而Hoare会从lo快速排序到p。可以得出的另一个推论是,如果Hoare的partition返回i而不是j,我们会将数组分成两部分 - 来自{{1}就像Lomuto一样,从loi-1再到i+1。我花了4个小时才明白这一点。