当使用大数组的冒泡排序时,Java程序因StackOverflow崩溃
我已经为int数组编写了一个实现冒泡排序技术的小型Java程序。它适用于1000个单元的阵列,但当我将其增加到10000时,它会在java.lang.StackOverflowerError中崩溃 代码如下:当使用大数组的冒泡排序时,Java程序因StackOverflow崩溃,java,arrays,stack-overflow,bubble-sort,Java,Arrays,Stack Overflow,Bubble Sort,我已经为int数组编写了一个实现冒泡排序技术的小型Java程序。它适用于1000个单元的阵列,但当我将其增加到10000时,它会在java.lang.StackOverflowerError中崩溃 代码如下: import java.util.*; import java.lang.*; class BubbleSort { public static void main (String [] argv) { int Array [] = new int [10000];
import java.util.*;
import java.lang.*;
class BubbleSort
{
public static void main (String [] argv)
{
int Array [] = new int [10000];
for (int a = 0; a < 10001; a++)
{
Array[a] = (int) (Math.random()*100);
}
// generated an array of 10000 units and filled with random numbers
for (int end = Array.length-1; end >= 0; end--)
{
BubbleSort (Array, 0, end);
}
}
public static int BubbleSort (int A [], int count, int end)
{
if (count == end) //debugger says crash occurs here
{
return count;
}
else
{
if (A[count] > A[count+1])
{
int temp = A[count];
A[count] = A[count+1];
A[count+1] = temp;
return BubbleSort(A, count+1, end); //and here
}
else
{
return BubbleSort(A, count+1, end);
}
}
}
}
非常感谢您的帮助 撇开逻辑不谈,它在10000失败的技术原因是因为Java中的每个线程都有一个固定的堆栈大小。当您使用10000时,它无法找到足够的内存 使用-XX:ThreadStackSize=512增加JVM分配给线程的默认内存,它可能会工作。但一般来说,你不必为此烦恼
在旁注中,检查您是否真的需要这里的递归。抛开逻辑不谈,为什么它在10000时失败的技术原因是因为Java中的每个线程都有一个固定的堆栈大小。当您使用10000时,它无法找到足够的内存 使用-XX:ThreadStackSize=512增加JVM分配给线程的默认内存,它可能会工作。但一般来说,你不必为此烦恼
在旁注中,检查您是否真的需要这里的递归。为什么要使用递归?你确定<10001看起来会先崩溃吗?请遵循Java大写惯例。注意在Java中使用递归:@ecbrodie仅仅存在堆栈溢出和/或缺乏尾部递归优化并不是避免在Java或任何其他语言中使用递归的原因。@ElliottFrisch Typo,对不起,这是一个问题,你为什么要使用递归?你确定<10001看起来会先崩溃吗?请遵循Java大写惯例。注意在Java中使用递归:@ecbrodie仅仅存在堆栈溢出和/或缺乏尾部递归优化并不是避免在Java或任何其他语言中使用递归的理由。@ElliottFrisch Typo,对不起,如果我没有像你正确指出的那样使用递归,我不需要它,但我想练习这样做,我不需要增加固定的堆栈大小?是的,你是对的。这对于正常应用来说已经足够了。只有当你有一些像这样的特殊要求时,才需要更改。如果我没有像你正确指出的那样使用递归,我不需要它,但我想练习这样做,我就不需要增加固定的堆栈大小了?是的,你是对的。这对于正常应用来说已经足够了。只有当您有这样的特殊要求时,才需要进行更改。