簡體   English   中英

了解以下Quicksort實施

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM