如何在不设置array.lenght-1的情况下修复简单快速排序中的java.lang.StackOverflowerError?
问题: 我实现了一个快速排序算法,不幸的是,它只对一些如何在不设置array.lenght-1的情况下修复简单快速排序中的java.lang.StackOverflowerError?,java,arrays,quicksort,Java,Arrays,Quicksort,问题: 我实现了一个快速排序算法,不幸的是,它只对一些int[]有效,然后中断。我得到错误StackOverflowerError 到目前为止,我尝试的是: 我必须调用排序(数组[],左,右)而不调用A[r] 我不能修改排序(array,0,array.length)到排序(数组,0,array.length-1)。我的想法是调用一个新函数,返回length-1并将其附加到变量right; 它只对某些int[]有效,然后中断 我的代码: 私有静态类快速排序{ 私有空排序(int[]数组,int左
int[]
有效,然后中断。我得到错误StackOverflowerError
到目前为止,我尝试的是:
我必须调用排序(数组[],左,右)
而不调用A[r]
我不能修改排序(array,0,array.length)
到排序(数组,0,array.length-1)
。我的想法是调用一个新函数,返回length-1并将其附加到变量right;
它只对某些int[]
有效,然后中断
我的代码:
私有静态类快速排序{
私有空排序(int[]数组,int左,int右){
right=lenRight(array);//获取array.lenght-1
int l=左;
int r=右;
int pivot=数组[右];
//模具分割
while(l轴)
r--;
//换模
if(l)
排序(数组,l,右);
}
公共int lenRight(int[]数组){
返回数组长度-1;
}
公共无效排序(int[]数组){
排序(数组,0,数组.长度);
}
}
我的错误
Testing array [30, 88]
PASS
Testing array [75, 35]
PASS
Testing array [15, 62]
PASS
Testing array [52, 55, 46]
PASS
Testing array [18, 22, 56]
Exception in thread "main" java.lang.StackOverflowError
at Sorting$Quicksort.sort(Sorting.java:36)
at Sorting$Quicksort.sort(Sorting.java:36)
at Sorting$Quicksort.sort(Sorting.java:36)
at Sorting$Quicksort.sort(Sorting.java:36)
at Sorting$Quicksort.sort(Sorting.java:36)
at Sorting$Quicksort.sort(Sorting.java:36)
at Sorting$Quicksort.sort(Sorting.java:36)
at Sorting$Quicksort.sort(Sorting.java:36)
at Sorting$Quicksort.sort(Sorting.java:36)
代码可以在输入之后和进行递归调用时调整正确的参数。排序应该是一个静态函数吗
private static void sort(int[] array, int left, int right) { // static?
right -= 1; // adjust
int l = left;
int r = right;
int pivot = array[(l+r)/2]; // middle value better if data already sorted
while (l <= r) {
while (array[l] < pivot)
l++;
while (array[r] > pivot)
r--;
if (l <= r) {
int temp = array[l];
array[l] = array[r];
array[r] = temp;
l++;
r--;
}
}
if (left < r)
sort(array, left, r+1); // adjust
if (l < right)
sort(array, l, right+1); // adjust
}
private static void sort(int[]数组,int left,int right){//static?
右-=1;//调整
int l=左;
int r=右;
int pivot=array[(l+r)/2];//如果数据已经排序,则中间值更好
while(l轴)
r--;
如果(l)您尝试过使用调试器并一步一步地运行代码吗?请查看参数:您从未更改left
,因此对于已排序的数组,您一直传递0,因此0
始终为真。然后您总是“重置”right
到array.length-1
,这是所有调用的相同值(在您的示例中为2)。由于数组已排序,因此您的“partion”循环在交换之前总是以l==r
结束,所以你总是用它自己交换最后一个元素。在你的例子中,在交换之后,你会以l==3
和r==1
结束,因为left==0
你传递了0和1,但再次覆盖了right
到2。@Thomas谢谢你。我明白了,但我确实明白了我不知道如何解决这个问题。你可能想重新使用快速排序算法(例如),但我至少要做两个改变:1)不要调用right=lenRight(array);
但在初始调用中传递array.length-1
,2)只有在(l
时才交换,即如果l==r
则不需要交换。