java中输入集小的堆栈溢出错误
我正在尝试用java编写快速排序。但是,对于非常小的输入集,会出现堆栈溢出错误。在createArray函数中,我接受Scanner对象的输入 请有人帮帮我java中输入集小的堆栈溢出错误,java,Java,我正在尝试用java编写快速排序。但是,对于非常小的输入集,会出现堆栈溢出错误。在createArray函数中,我接受Scanner对象的输入 请有人帮帮我 public class quickSort { static int[] ar; int number; public static void main(String args[]) { CreatingArray ca = new CreatingArray(); ar = ca.createArray();
public class quickSort {
static int[] ar;
int number;
public static void main(String args[]) {
CreatingArray ca = new CreatingArray();
ar = ca.createArray();
ca.printArray(ar);
int len = ar.length;
sort(0,(len-1));
System.out.println("");
System.out.println("Array after QuickSort:");
ca.printArray(ar);
}
public static void sort(int l,int h) {
int i=l;
int j=h;
int temp =0;
int pivot = ar[(l + (l+h)/2)];
while(i <= j) {
while(ar[i] < pivot) {
i++;
}
while(ar[j] > pivot) {
j--;
}
if (i<=j) {
temp = ar[i];
ar[i] = ar[j];
ar[j] = temp;
i++;
j--;
}
}
if(l<j){
sort(l,j);
}
if(i<h) {
sort(i,h);
}
}
公共类快速排序{
静态int[]ar;
整数;
公共静态void main(字符串参数[]){
CreatingArray ca=新CreatingArray();
ar=ca.createArray();
ca.printary(ar);
int len=ar.长度;
排序(0,(len-1));
System.out.println(“”);
System.out.println(“快速排序后的数组:”);
ca.printary(ar);
}
公共静态无效排序(int l,int h){
int i=l;
int j=h;
内部温度=0;
int-pivot=ar[(l+(l+h)/2)];
而(我){
j--;
}
如果(i我认为递归调用没有结束…用非常小的输入调试代码-比如3个数字…检查调用sort()的时间和方式
int pivot = ar[(l + (l+h)/2)];
这条线是错误的。它只在l==0
时得到中心点。如果说l==4&&h==7
(例如,一个8元素数组的上半部分),你得到4+(4+7)/2
,这是9
,因此超出了范围。你真的想要l+(h-l+1)/2
因此可能发生的第一件事是ArrayIndexOutOfBoundsException
,但您永远不会得到它,因为您总是首先在较低的分区上递归,然后遇到第二个问题。在函数末尾交换两个if
s,以查看此操作
第二件可能发生的事情是,因为pivot
实际上不是范围[i,j]
中的元素,所以循环开始时的元素搜索可能会变得疯狂。特别是,pivot
可能是一个非常小的值,比范围内的任何值都小。i
搜索将立即终止(保留i==l
它开始的方式),而j
搜索将远远超出i
,这意味着如果也不会被输入,i
仍然不会改变,主循环终止。因为i
没有改变,i