[英]Understanding the following Quicksort Implementation
我有以下兩種方法:
public static void QuickAlgo(int[] a, int left, int right) {
int index = partition(a, left, right);
if (left < index - 1) {
QuickAlgo(a, left, index - 1);
}
if (index < right) {
QuickAlgo(a, index, right);
}
}
static int partition(int[] a, int left, int right) {
int pivot = a[(left + right) / 2];
while (left <= right) {
while (a[left] < pivot) {
left++;
}
while (a[right] > pivot) {
right--;
}
if (left <= right) {
int temp = a[left];
a[left] = a[right];
a[right] = temp;
left++;
right--;
}
}
return left;
}
假設對於上述問題,我具有以下未排序的數據:
_______________________________________
65 | 72 | 23 | 36 | 99 | 20 | 1 | 44 |
假設,我在這里的樞紐是36
。
當調用partition
method時,我了解它正在以下循環中檢查數組索引值while(left <= right)
現在,對於以下代碼段:
if (left <= right) {
int temp = a[left];
a[left] = a[right];
a[right] = temp;
left++;
right--;
}
不應該是這樣的:
1)應該先比較a [left]與數據透視,例如在我的示例65> 36中,因此有資格進行交換。 同樣,pivot必須與a [right]進行比較,在我的示例中為44,由於pivot(36)<44,指針遞減並移動到1,因此1有資格進行交換,因為pivot(36)> 1。
而我上面提到的上述代碼片段是直接比較索引值並交換數字。
可能是我在這里不了解某些內容。 有人可以解釋嗎?
謝謝
當談到交換點時,與您提到的樞軸的比較已經完成。 第一個while循環在找到大於樞軸的值時結束,而第二個循環在發現小於樞軸的值時結束。 這意味着左右兩個指針都找到了錯誤的值,因此這兩個值都可以交換。
if (left <= right)
僅用於確保一旦左光標經過右光標后就不交換值。 當左光標經過右光標時,表示分割已完成,因此不再需要進行交換。
我們這樣做是為了確保樞軸左側的所有元素都小於樞軸,而樞軸右側的所有元素都大於樞軸。 現在,如果您看到兩個while循環之前 如果(a [left] <樞軸)
它們用於遍歷到元素從起點開始小於樞軸的點,而另一個用於使元素從末端開始大於樞軸的點。 現在考慮:3 4 19 7 21 2作為數組,7是樞軸。 在這里,我們將剩下left = 2和right = 5 ...因此,我們交換了這兩個元素。 並在左側進行分區,因為我們確保左側的所有元素都小於左側。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.