Java 快速排序中的堆栈溢出

Java 快速排序中的堆栈溢出,java,stack-overflow,quicksort,Java,Stack Overflow,Quicksort,如果我用numbers.length n=100.000(“.”只是为了可读性),并且数字的顺序是相反的,比如100.000 99.999 99.998,那么我会遇到堆栈溢出。。。这正常吗?它适用于较小的n,如10.000 private void quickSort(int[] numbers, int l, int r) { if (l < r) { int p = numbers[r]; int i = l - 1; int j = r;

如果我用numbers.length n=100.000(“.”只是为了可读性),并且数字的顺序是相反的,比如100.000 99.999 99.998,那么我会遇到堆栈溢出。。。这正常吗?它适用于较小的n,如10.000

private void quickSort(int[] numbers, int l, int r) {
    if (l < r) {
      int p = numbers[r];
      int i = l - 1;
      int j = r;
      do {
        do {
          i++;
        } while (numbers[i] < p);
        do {
          j--;
        } while (j >= l && numbers[j] > p);
        if (i < j) {
          swap(numbers, i, j);
        }
      } while (i < j);
      swap(numbers, i, r);
      quickSort(numbers, l, i - 1);
      quickSort(numbers, i + 1, r);
    }
  }
private void快速排序(int[]数字,int l,int r){
if(l=l&&numbers[j]>p);
if(i
您可能进行了太多的递归调用,因为数组已经排序。您可以允许JVM使用更多内存或更改最大递归深度。更好的解决方案是实现非递归快速排序。这是一个Java。

我猜您已经超过了递归深度——即使这不应该发生在对数深度上……您总是将最右边的元素作为轴心。当输入已经排序时,这是一个错误的选择。谢谢Wumpus Q。Wumbley如果数字是随机的,那就这样了。没问题!我怎样才能给JVM提供更多的内存呢?看看这个,其他标准的解决方案是:以中间元素而不是一个端点作为轴心;或者,如果你偏执于一个更不可能的最坏情况是一个固定的情况,选择一个随机元素作为支点。