Java 多元素快速排序会导致StackOverflower错误
你好!运行快速排序算法时,我遇到StackOverflower错误。 当数组中的元素>50000时,会发生此错误 我的代码如下: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
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。这很容易受到堆栈溢出的影响。它的可能重复可能是一个“关闭一个”错误,这会导致意外的长堆栈深度。请使用调试器并检查输入值和变量是否位于正确的索引位置。