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

我正在做一个算法类项目,其中我们必须修改QuickSort的实现,并提出改进建议。其中一个建议如下:不要在数组中挑出pivot,并避免分区方法的最后一次交换

我很难理解他这是什么意思。如果没有枢轴,它怎么还能继续快速排序?对这可能意味着什么的任何洞察都将不胜感激。这是要修改的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()

我不打算为您实现它,但我对这一建议改进的解释是,他希望您仍然选择一个轴值,并根据它们位于该值的哪一侧将数组划分为多个部分,而不是专门处理包含该值的数组项


这应该不难做到,但它根本不会提高算法的性能,而且我怀疑这在任何其他意义上都是一个很大的改进。

看起来他不想让你关注数组中的实际元素。分区方法中最后一次交换的要点是,他将枢轴移动到数组中的正确位置。请注意,他从不在分区调用后移动枢轴元素

编辑如果您对不使用轴感到困惑,您仍然在使用轴。。。它不是阵列中的一个支点。想象一下,用手进行快速排序,您可以选择任意值作为轴心


问题是,这种交换根本不会对性能产生负面影响。另一方面,这应该是一个快速变化…

这是有意义的,但是,我应该如何选择一个保证在数字范围内的任意值?例如,如果数组都是负数,而任意轴都是正数,则不会进行排序。对,如果不在该范围内选择轴,则不会真正进行排序。代码仍然有效,只是没有边界。。。它可以永远循环。他的改进建议清单是写下来的还是他在讲座中提到的?我觉得你们可以做任何你们想做的改进,他只是在演讲中提出了一些想法。你可以考虑用自己的想法改进它吗?