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