Mergesort:获取100000个数字的java.lang.StackOverflower错误,但不获取10000个

Mergesort:获取100000个数字的java.lang.StackOverflower错误,但不获取10000个,java,mergesort,stack-overflow,Java,Mergesort,Stack Overflow,我的代码适用于10000个数字,但不适用于100000个数字 错误发生在 result.add(next); result.addAll(mergeInt(left,right)); 代码如下: private static ArrayList<Integer> mergeSortInt(ArrayList<Integer> array) { if (array.size() <= 1) return array; Arr

我的代码适用于10000个数字,但不适用于100000个数字

错误发生在

result.add(next);
result.addAll(mergeInt(left,right));
代码如下:

private static ArrayList<Integer> mergeSortInt(ArrayList<Integer> array)
    {
        if (array.size() <= 1) return array;

        ArrayList<Integer> left = new ArrayList<>();
        ArrayList<Integer> right = new ArrayList<>();

        for (int i = 0; i < array.size() / 2; i++)
        {
            left.add(array.get(i));
        }
        for (int i = array.size() / 2; i < array.size(); i++) 
        {
            right.add(array.get(i));
        }

        return mergeInt(mergeSortInt(left), mergeSortInt(right));
    }

    private static ArrayList<Integer> mergeInt(ArrayList<Integer> left, ArrayList<Integer> right)
    {
        if (left.size() == 0) return right;
        if (right.size() == 0) return left;

        ArrayList<Integer> result = new ArrayList<Integer>();

        int next;

        if (left.get(0) > right.get(0))
        {
            next = right.get(0);
            right.remove(0);
        }
        else 
        {
            next = left.get(0);
            left.remove(0);
        }

        result.add(next);
        result.addAll(mergeInt(left,right));

        return result;
    }
private static ArrayList mergeSortInt(ArrayList数组)
{
if(array.size()right.get(0))
{
next=right.get(0);
对。删除(0);
}
其他的
{
next=left.get(0);
左。移除(0);
}
结果。添加(下一步);
addAll(mergint(左、右));
返回结果;
}
StackOverflowerr到底是什么?为什么只有大量的数字才会出现这种情况

提前感谢:)

编辑:


我真的不明白这是怎么一个重复,因为我还特别要求代码方面的帮助。

当堆栈上有太多存储方法环境时,就会发生StackOverflower错误。当一个函数调用另一个函数时,它必须将其变量和状态存储在堆栈框架中。当对另一个函数的调用返回时,会弹出原始函数的帧并用于恢复函数的状态


由于mergesort是一种递归算法,
mergint
将在每次递归调用自身时将另一帧推送到堆栈中。Mergesort要求递归调用的深度为
log_2n
,其中
n
是输入的长度。因此,当增加
n
时,就增加了必须创建和存储的堆栈帧的数量。如果它们太多,您将得到一个StackOverflowerError。

方法调用在堆栈上进行。当你递归到一个太深的层次时,你会试图在堆栈上放置太多的东西,从而使堆栈溢出。它(以抽象的方式)类似于代码中的无限循环(或者只是一个很长的循环)。@JesanFafon-“当你重复得太深时……”。是的,这经常让你反复咒骂,但那完全是另一个词。