我的代码适用于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究竟是什么?为什么它只出现在更大数量的数字上?
提前致谢:)
编辑:
我真的不知道这是怎么回事,因为我还要求我专门提供帮助。
答案 0 :(得分:0)
如果堆栈上存储的方法环境太多,则会发生StackOverflowError。当一个函数调用另一个函数时,它必须将其变量和状态存储在堆栈框架中。当对另一个函数的调用返回时,弹出原始函数的框架并用于恢复函数的状态。
由于mergesort是一种递归算法,mergeInt
会在每次递归调用时将另一帧推送到堆栈。 Mergesort需要log_2 n
递归调用的深度,其中n
是输入的长度。因此,当您增加n
时,会增加必须创建和存储的堆栈帧数。如果有太多这些,你将得到一个StackOverflowError。