所有变量名都来自Quicksort's wikipedia page的Lomuto&和Hoare的快速排序伪代码。
如果p
是partition
函数返回的内容,则Hoare将其数组从lo
分为p
,从p+1
分割为hi
},而Lomuto将他的数组从lo
分为p-1
,从p+1
分为hi
。
我可能错了,但Quicksort的哲学是......
我觉得Hoare的partition
比Lomuto更容易理解。 Hoare的分区只是指示我们从左端和右端开始并继续朝着彼此移动。如果左标记遇到大于枢轴的元素,则左标记暂停,并等待右标记找到小于枢轴的元素。然后他们交换元素,使左标记具有较小的元素,右标记具有较大的元素。他们一直这样做,直到他们相遇。非常直截了当。
Lomuto的partition
,可以被认为是一种蛇,由两部分组成,头部和尾部。枢轴是固定的(我通常将最后一个元素作为Lomuto的枢轴)。蛇从左侧开始,并在最后一个元素之前停止。当蛇遇到小于枢轴的元素时,该元素到达尾部并且尾部的长度增加。当发现大于枢轴的元素时,该元素将进入蛇的头部。最后,枢轴放置在尾部和头部之间。它非常清晰但不像Hoare的partition
那样直观或有效(在某些情况下)。
让我感到困惑的是,Hoare的分区并没有确保partition
之后枢轴的位置已经完成,将是它在决赛中的位置,排序数组。我在Hoare分区中唯一可识别的模式是i
位于数据透视的最终位置,而j
是i
或i-1
,j
和i
是左右标记。
lo
分割为p-1
和从p+1
分割为hi
是有意义的。但是,我无法理解 Hoare如何将他的阵列从lo
分割为p
以及从p+1
分割为hi
,以弥补他的分区而不是把它的支点放在合适的位置。
答案 0 :(得分:0)
我一直在通过Hoare的快速搜索方式查看示例和排序数组。我想我在Hoare的分区算法中发现了另一种有趣的模式。这可以解释为什么Hoare的方法有效。 Lomuto将数组划分为三个部分;元件小于枢轴,枢轴,元件大于枢轴。我认为Hoare以不同的方式看待事物。他将数组划分为两个部分;小于枢轴的元素,元素等于或大于数据透视。其中一个陷阱是Lomuto的分区返回了枢轴的最终位置,而Hoare的分区返回了枢轴最终位置之前的位置。这就是为什么Lomuto会从lo
快速排序到p-1
,而Hoare会从lo
快速排序到p
。可以得出的另一个推论是,如果Hoare的partition
返回i
而不是j
,我们会将数组分成两部分 - 来自{{1}就像Lomuto一样,从lo
到i-1
再到i+1
。我花了4个小时才明白这一点。