Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不设置array.lenght-1的情况下修复简单快速排序中的java.lang.StackOverflowerError?_Java_Arrays_Quicksort - Fatal编程技术网

如何在不设置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
则不需要交换。