Mergesort:为100000个数字获取java.lang.StackOverflowError,但不是10000

时间:2014-05-13 18:06:02

标签: 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;

        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;
    }

StackOverFlowError究竟是什么?为什么它只出现在更大数量的数字上?

提前致谢:)

编辑:

我真的不知道这是怎么回事,因为我还要求我专门提供帮助。

1 个答案:

答案 0 :(得分:0)

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

由于mergesort是一种递归算法,mergeInt会在每次递归调用时将另一帧推送到堆栈。 Mergesort需要log_2 n递归调用的深度,其中n是输入的长度。因此,当您增加n时,会增加必须创建和存储的堆栈帧数。如果有太多这些,你将得到一个StackOverflowError。