【发布时间】:2015-06-06 06:03:20
【问题描述】:
在练习考试时,我遇到了一个(对我而言)关于快速排序的奇怪问题。
我的实现:
public void quicksort(int l, int r)
{
if(l<r && l>0 && r<=array.length-1)
{
int pivot = array[pivot(l, r)];
int i = l;
int j = r;
if(j==i+1)
{
if(array[i]>array[j])
{
System.out.println(array[i]+"<->"+array[j]);
int help = array[i];
array[i] = array[j];
array[j] = help;
}
}
else{ while(i<=j)
{
if(array[i]>=pivot && pivot>= array[j])
{
System.out.println(array[i]+">="+pivot+">="+array[j]);
int help = array[i];
array[i] = array[j];
array[j] = help;
i++;
j--;
}
else{
i++;
}
}
if(l<j && j<array.length-1)quicksort(l, j);
if(i<r)quicksort(i, r);
}
}
}
但这在(此处)第 34 行中给了我一个“Java.lang.StackOverflowError: null”。但是,可以通过在第 34 行和第 35 行中将 j 与 j-1 和 i 与 j 交换来避免此错误。我真的尝试了所有想到的东西,但我真的想不出一个解决方案:/
【问题讨论】:
-
预期的输入输出是什么?
-
不使用调用堆栈,而是使用堆栈集合。创建一个,因为 java 唯一的堆栈实现是同步的。
-
int 数组“array”是在另一种方法中定义的。 l 是当前列表的左边界元素,r 是右边界元素。两者都是 int 值,因为它们被用作 int 数组的索引。
-
...为什么它不是函数的参数?
-
你是指枢轴元素吗?
标签: java recursion stack-overflow quicksort