簡體   English   中英

我不明白這種快速排序的實現

[英]I don't understand this quicksort implementation

我有一個C ++中的quicksort代碼,可以完美地用於非唯一元素數組。 我敢肯定,這里有很多人都知道,但是,誰能理解呢? 讓我更好地解釋自己。 這是代碼:

void quicksort(int a[], int first, int last){
    int i,j;
    int pivot;

    if((last -first + 1) <= 1) return;

    pivot = a[(first+last) / 2];
    i = first;
    j = last;

    while(i <= j){
        while(a[i] < pivot) i++;
        while(a[j] > pivot) j--;

        if(i <= j){
            //SWAP
            int temp = a[i];
            a[i] = a[j];
            a[j] = temp;

            i++;
            j--;
        }
    }

    quicksort(a, first, j);
    quicksort(a,i, last);
}

所以,我了解一切,但如果在交換。 誰能從數學上告訴我,在兩個內部while之后i> j的確切情況或一組情況是什么? 我知道具體情況,但是發生情況的數學(或精確)性質是什么?

對不起,英語不好,謝謝。

PD:在這種情況下,請忽略優化,或者選擇樞軸和所有其他東西。

如果在開始時a [i]>樞軸(所以我沒有改變)並且a [j]>所有j的樞軸,直到a [j] =樞軸,則循環的下一次迭代將導致j <i。

為了顯示...

采取以下數組:

int a[] = [10, 7, 2, 6, 3];

在快速排序的第一次調用中,第一個為0,最后一個為4(數組中的最后一個索引),數據透視將為a [2] =2。在第一次迭代中,如果while循環中a [0]> 2,則我沒有改變。 a [4]> 2,j--,a [3]> 2,j--,a [2] = 2,現在我們命中了if語句。 0 <= 2,所以我們交換a [0]和a [2]並執行i ++和j--。

現在,數組如下所示:

[2, 7, 10, 6, 3]

當i = 1且j = 1時。a [i]> 2,因此i不變。 a [j]> 2,所以j--,j現在為0。a [j]不大於2(因為它是2),並且j保持為0。現在,我們有i = 1和j = 0 ,或i> j。

如果您注意到,則2處於“已排序”位置,因此不再需要移動。 同樣,樞軸是數組中最小的元素。 希望可以幫助您解決。

ij從數組的任一端開始,直到找到一個大於樞軸( a[i] )且小於樞軸( a[j] )的值。 當找到兩個這樣的值時,它們將被交換位置,因此您將得到一個數組,其中在循環i至結尾之后,軸的起始點大於軸心,而j的起始點小於軸心。 比我們在這兩個子數組上遞歸。

列表完成后,將i>j除以數據透視值。 ij覆蓋了數組中的每個值,以確保其位於軸的正確一側。 這可能發生在數組中間,或者僅交換了一個值之后,具體取決於數據透視表值在列表中的位置。 支點可以是最大值或最小值,也可以正好在值列表的中間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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