簡體   English   中英

QuickSort算法改進

[英]QuickSort Algorithm Improvement

我正在做一個算法類項目,在這個項目中,我們必須通過建議的改進來修改QuickSort的實現。 這些建議之一如下:不要單挑數組中的樞軸,並且避免最后一次交換分區方法。

我很難確切了解他的意思。 沒有樞軸,QuickSort怎么還沒有? 任何對此暗示的見解將不勝感激。 這是要修改的Java代碼。

public void quickSort() {
    recQuickSort(0, nElems - 1);
}

public void recQuickSort(int left, int right) {
    if (left >= right)
        return;
    long pivot = a[right];
    int mid = partition(left, right, pivot);
    recQuickSort(left, mid - 1);
    recQuickSort(mid + 1, right);
} // end recQuickSort()

public void swap(int dex1, int dex2) { // swap two elements
    long temp = a[dex1]; // A into temp
    a[dex1] = a[dex2]; // B into A
    a[dex2] = temp; // temp into B
} // end swap()

public int partition(int left, int right, long pivot) {
    // assuming pivot == a[right]
    int leftPtr = left - 1; // left of the first element
    int rightPtr = right; // position of pivot
    while (true) {
        while (a[++leftPtr] < pivot)
            ; // find bigger
        while (leftPtr < rightPtr && a[--rightPtr] >= pivot)
            ; // find smaller
        if (leftPtr >= rightPtr) // if pointers cross,
            break; // partition done
        else
            // not crossed, so
            swap(leftPtr, rightPtr); // swap elements
    } // end while(true)
    swap(leftPtr, right); // restore pivot
    return leftPtr; // return pivot location
} // end partition()

我不會嘗試為您實現它,但是我對這個建議的“改進”的解釋是,他希望您仍然選擇一個樞軸值,並根據數組位於該值的哪一側將其划分為多個部分。 ,但不特別對待包含該值的數組條目。

這不應該很難,但是它根本不會提高算法的性能,我懷疑這在任何其他意義上都是很大的改進。

似乎他不希望您對數組中的實際元素進行透視。 partition()方法中最后一次交換的要點是,他將樞軸移動到數組中的正確位置(請注意,在調用partition()之后,他從未移動樞軸元素)。

編輯如果您對“不使用樞軸”感到困惑,那么您仍在使用樞軸...它不是數組中的樞軸。 想象一下手動進行快速排序,您可以選擇任何任意值作為樞軸。

問題在於,交換並不會對性能產生任何負面影響。 另一方面,這應該是一個快速的更改...

暫無
暫無

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

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