所有變量名都來自Quicksort's wikipedia page的Lomuto's和Hoare的快速排序僞代碼。即使分區()之後的樞軸的最終位置不是它在排序數組中的位置,Hoare的快速排序如何工作?
如果p
就是由partition
函數返回,霍爾分他從陣列到lo
和p
從p+1
到hi
,而Lomuto分他從陣列到lo
和p-1
從p+1
到hi
。
我可能是錯關於這一點,但快速排序的理念是...
- 以一個元素在子陣列(支點)。
- 以這樣的方式重新排列子陣列,即所有元素左側的元素都小於主元,並且主元右側的所有元素都大於主元。
- 將數組除以數據點。重複這兩個較小子子陣列的過程。繼續這樣做直到遇到只有一個或更少元素的數組,因爲它已經被排序。
我覺得Hoare的partition
比Lomuto更容易理解。霍爾的分區只是指示我們從左端和右端開始,並繼續向對方移動。如果左標記遇到比樞軸更大的元素,則左標記暫停,並等待右標記找到比樞軸小的元素。然後他們交換元素,以便左標記具有更小的元素,右標記具有更大的元素。他們繼續這樣做直到他們見面。非常簡單。
Lomuto的partition
,可以被視爲一種蛇,由兩部分組成,頭部和尾部。樞軸是固定的(我通常把最後一個元素作爲Lomuto的樞軸)。蛇從左側開始,並在最後一個元素之前停止。當蛇遇到比樞軸小的元素時,該元素進入尾部並且尾部的長度增加。當發現一個大於主元的元素時,該元素會進入蛇的頭部。最後,樞軸位於尾部和頭部之間。這很清楚,但不像霍爾的partition
那樣直觀或有效(在某些情況下)。
讓我感到困惑的是,Hoare的分區並不能確保partition
之後的樞軸位置已經運行,它將在最終的排序數組中位置。我可以在霍爾的分區所承認的唯一模式是i
處在樞軸的最終位置和j
要麼i
或i-1
,j
和i
是左,右標誌。
但是,Lomuto的分區保證它。所以,當我退後一步看看更大的圖片時,Lomuto將數組從lo
分成p-1
和p+1
到hi
是合理的。但是,我不明白霍爾怎麼可以將他的數組從lo
分成p
和p+1
到hi
,彌補了他的分區沒有把它的支點放在合適的地方。
我不明白你在說什麼。請在您的問題中包含有問題的代碼。 – melpomene
這是我的理解,在霍爾分區方案中,樞軸在其排序位置結束,但它可以作爲左側部分的最後一個值或右側部分的第一個值。如果有多個值等於主軸,那麼它們中的任何一個都可能以「主軸」位置結束。 – rcgldr