当使用大数组的冒泡排序时,Java程序因StackOverflow崩溃

当使用大数组的冒泡排序时,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];

我已经为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];
    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,对不起,如果我没有像你正确指出的那样使用递归,我不需要它,但我想练习这样做,我不需要增加固定的堆栈大小?是的,你是对的。这对于正常应用来说已经足够了。只有当你有一些像这样的特殊要求时,才需要更改。如果我没有像你正确指出的那样使用递归,我不需要它,但我想练习这样做,我就不需要增加固定的堆栈大小了?是的,你是对的。这对于正常应用来说已经足够了。只有当您有这样的特殊要求时,才需要进行更改。