Java 多元素快速排序会导致StackOverflower错误

Java 多元素快速排序会导致StackOverflower错误,java,stack-overflow,quicksort,Java,Stack Overflow,Quicksort,你好!运行快速排序算法时,我遇到StackOverflower错误。 当数组中的元素>50000时,会发生此错误 我的代码如下: public void recQuickSort(int left, int right) { if(right-left <= 0) return; else { long pivot = a[right]; int partition = partitionIt(left, right, piv

你好!运行快速排序算法时,我遇到StackOverflower错误。 当数组中的元素>50000时,会发生此错误

我的代码如下:

public void recQuickSort(int left, int right)
{
    if(right-left <= 0)
        return;
    else {
        long pivot = a[right];
        int partition = partitionIt(left, right, pivot);
        recQuickSort(left, partition-1);  
        recQuickSort(partition+1, right); 
    }
}
public int partitionIt(int left, int right, long pivot) {
    int leftPtr = left - 1;
    int rightPtr = right;
    while (true) {
        while (a[++leftPtr] < pivot) ;
        while (rightPtr > 0 && a[--rightPtr] > pivot) ;
        if (leftPtr >= rightPtr)
            break;
        else
            swap1(leftPtr, rightPtr);
    }
        swap1(leftPtr, right);
        return leftPtr;
}

public void swap1(int dex1, int dex2)  // Permutation of two elements
{
    long temp;
    temp = a[dex1];
    a[dex1] = a[dex2];
    a[dex2] = temp;
}

当元素>50000时,如何修复此错误?

仅在较小的分区上递归,然后更新左侧或右侧,并针对较大的分区进行循环。这将防止将堆栈溢出限制为log2n堆栈帧,但不会防止^2上的最坏情况时间复杂性

public void recQuickSort(int left, int right)
{
    while(true){
        if(right-left <= 0)
            return;
        else {
            long pivot = a[right];
            int partition = partitionIt(left, right, pivot);
            if((partition - left) <= (right - partition)){
                recQuickSort(left, partition-1);
                left = partition+1;
            } else {
                recQuickSort(partition+1, right);
                right = partition-1;
            }
        }
    }
}

这是所有递归算法的固有问题。最终会耗尽堆栈内存。Java已经给出了部分修复,但如果输入大小足够大,您将始终能够生成StackOverflowException。您使用的是递归函数,每次都将输入分成一半。对于50000个元素,您看到的最佳情况堆栈深度约为logu 250000~=16。在最坏的情况下,堆栈深度为50000。这很容易受到堆栈溢出的影响。它的可能重复可能是一个“关闭一个”错误,这会导致意外的长堆栈深度。请使用调试器并检查输入值和变量是否位于正确的索引位置。