我正在做一个算法类项目,我们必须修改QuickSort的实现,并提供改进建议。其中一个建议如下:不要挑出数组中的pivot,并避免最后一次交换分区方法。
我很难理解他的确切含义。没有支点,它甚至还是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()
答案 0 :(得分:0)
我不会尝试为你实现它,但我对此的解释表明“改进”是他希望你仍然选择一个轴值并根据部分将数组分区它们所在的那个值的哪一侧,但没有特别处理包含该值的数组条目。
这应该不难做到,但它根本不会提高算法的性能,我怀疑它在任何其他意义上都有很大改进。
答案 1 :(得分:0)
看起来他不希望你转向数组中的实际元素。 partition()
方法中最后一次交换的要点是他将数据移动到数组中的正确位置(请注意,在partition()
调用后,他永远不会移动数据元素。)
编辑如果您对“不使用数据透视”感到困惑,那么您仍在使用数据透视表......它只是数组中的一个数据透视表。想象一下,手动执行快速排序,您可以选择任意值来转动。
问题在于交换根本不会对性能产生负面影响。另一方面,这应该是一个快速变化......