Mergesort:获取100000个数字的java.lang.StackOverflower错误,但不获取10000个
我的代码适用于10000个数字,但不适用于100000个数字 错误发生在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
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-“当你重复得太深时……”。是的,这经常让你反复咒骂,但那完全是另一个词。