我主要使用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);
}
我尝试更改边界值,但总是出现错误。
我想我找到了错误原因。
以防万一,
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
。
希望这对你有帮助,如果可以的话标记为答案并投票,谢谢。