【问题标题】:StackOverflow in Quicksort快速排序中的 StackOverflow
【发布时间】:2018-05-31 17:34:23
【问题描述】:

如果我尝试使用 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);
    }
  }

【问题讨论】:

  • 我猜你超出了递归深度——即使这不应该发生在对数深度上......
  • 你总是以最右边的元素为轴心。当输入已经排序时,这是一个糟糕的选择。
  • 感谢 Wumpus Q。Wumbley 就是这样,如果数字是随机的,没问题!

标签: java stack-overflow quicksort


【解决方案1】:

您可能进行了太多递归调用,因为数组已经排序。您可以允许 JVM 使用更多内存或更改最大递归深度。更好的解决方案是实现非递归快速排序。这是一个 Java example

【讨论】:

  • 我怎样才能让更多的内存给 JVM?
  • 其他标准解决方案是:将中间元素而不是末端之一作为枢轴;或者,如果您对不太可能的最坏情况是固定情况感到偏执,请选择一个随机元素作为枢轴。
猜你喜欢
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 2014-10-10
  • 2016-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多