Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.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
java中输入集小的堆栈溢出错误_Java - Fatal编程技术网

java中输入集小的堆栈溢出错误

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();

我正在尝试用java编写快速排序。但是,对于非常小的输入集,会出现堆栈溢出错误。在createArray函数中,我接受Scanner对象的输入

请有人帮帮我

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