Java 快速排序算法改进
我正在做一个算法类项目,其中我们必须修改QuickSort的实现,并提出改进建议。其中一个建议如下:不要在数组中挑出pivot,并避免分区方法的最后一次交换 我很难理解他这是什么意思。如果没有枢轴,它怎么还能继续快速排序?对这可能意味着什么的任何洞察都将不胜感激。这是要修改的Java代码Java 快速排序算法改进,java,sorting,quicksort,Java,Sorting,Quicksort,我正在做一个算法类项目,其中我们必须修改QuickSort的实现,并提出改进建议。其中一个建议如下:不要在数组中挑出pivot,并避免分区方法的最后一次交换 我很难理解他这是什么意思。如果没有枢轴,它怎么还能继续快速排序?对这可能意味着什么的任何洞察都将不胜感激。这是要修改的Java代码 public void quickSort() { recQuickSort(0, nElems - 1); } public void recQuickSort(int left, int righ
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()
我不打算为您实现它,但我对这一建议改进的解释是,他希望您仍然选择一个轴值,并根据它们位于该值的哪一侧将数组划分为多个部分,而不是专门处理包含该值的数组项
这应该不难做到,但它根本不会提高算法的性能,而且我怀疑这在任何其他意义上都是一个很大的改进。看起来他不想让你关注数组中的实际元素。分区方法中最后一次交换的要点是,他将枢轴移动到数组中的正确位置。请注意,他从不在分区调用后移动枢轴元素 编辑如果您对不使用轴感到困惑,您仍然在使用轴。。。它不是阵列中的一个支点。想象一下,用手进行快速排序,您可以选择任意值作为轴心
问题是,这种交换根本不会对性能产生负面影响。另一方面,这应该是一个快速变化…这是有意义的,但是,我应该如何选择一个保证在数字范围内的任意值?例如,如果数组都是负数,而任意轴都是正数,则不会进行排序。对,如果不在该范围内选择轴,则不会真正进行排序。代码仍然有效,只是没有边界。。。它可以永远循环。他的改进建议清单是写下来的还是他在讲座中提到的?我觉得你们可以做任何你们想做的改进,他只是在演讲中提出了一些想法。你可以考虑用自己的想法改进它吗?