无法解决java中的stackoverflow错误

问题描述 投票:0回答:1

我主要使用Python,因为它在我的学校教学大纲中,但我喜欢Java(我对它还很陌生)。我试图在java中制作一个快速排序程序(递归),但发生了典型的堆栈溢出。我在java中制作了递归程序,但这次我只是不知道出了什么问题

这是设置枢轴的函数:

static void part(int[]a){
    int n = a.length;
    j=-1;
    for(int i=0;i<n;i++){
        if(a[n-1]<a[i]){continue;}
    else if(a[n-1]>=a[i]){
        j++;
        if(a[j]>a[i]){
        int t=a[j];
        a[j]=a[i];
        a[i]=t;
        }
    }
}

这是排序的函数:

static int[] sort(int[]a){
    if(a.length<=1){
        return(a);
        }
    part(a);
    int temp=j; //Variable 'j' is public
    sort(slice(a,0,temp));
    sort(slice(a,temp+1,a.length+1));
    return(a);
}

我尝试更改边界值,但总是出现错误。

java stack-overflow quicksort
1个回答
0
投票

我想我找到了错误原因。

以防万一,

int a[] = {2, 5, 1}
。我认为你的预期产出是
{5, 2, 1}

但是你的part()函数修改了变量

j
,在这种情况下,它总是0。因为part()函数正在将数组的所有元素与最后一个元素进行比较。那么,2 和 5 都大于 1,所以第一个 if 永远不会被执行。

else if
仅与
a[2]
一起执行,即
a[n-1]
,变量j增加,因此为0。

我使用了

Arrays.copyOfRange()
函数作为 slice() 。 因此,sort() 函数的第一个递归调用是“sort({})”,并且不执行任何操作。

第二个,是

slice(a, 0+1, 3+1)
,所以是
sort({5, 1, 0})
。你应该将
a.length+1
更改为
a.length

希望这对你有帮助,如果可以的话标记为答案并投票,谢谢。

© www.soinside.com 2019 - 2024. All rights reserved.