【问题标题】:Stackoverflow error while implementing insertion sort using recursion使用递归实现插入排序时出现 Stackoverflow 错误
【发布时间】:2013-02-04 19:57:50
【问题描述】:
public static void insertionSortRecursion(String a[], int first, int last) {
        if (first < last) {
            //sort all but last
            insertionSortRecursion(a, first, last - 1);
            insertInOrder(a[last], a, first, last -1);
        }
    }

    private static void insertInOrder(String element, String[] a, int first, int last) {
//        System.out.println(last - 1);
//        System.out.println(element);
//        System.out.println(a[last]);
        if (element.compareTo(a[last]) >= 0) {
            a[last + 1] = element;
        } else if(first < last) {
            a[last + 1] = a[last];
            insertInOrder(element, a, first, last - 1);
        } else {
            a[last + 1] = a[last];
            a[last] = element;
        }
    }

大家好, 我正在尝试使用递归来实现插入排序,它在少量单词上运行良好,但是在实现它之后我得到了 stackoverflow,因为我正在排序的文件大小有很多大约 10,000 个单词。请建议我应该怎么做才能消除错误。

These are the methods I am using for insertion sort using recursion and I am calling them in my constructor.

【问题讨论】:

  • 为什么要用递归来实现呢,可以轻松写出迭代插入排序(不递归消耗栈)。
  • Please suggest what should I do to remove the error。不要使用递归。
  • 顺便说一句:插入排序在如此大的数组上效率不高

标签: java recursion stack-overflow insertion-sort


【解决方案1】:

假设您的算法是正确的,请保持此函数不变。不要试图修复它。一般来说,要摆脱堆栈溢出(同时保持递归)有两种解决方案:

但是,让我们坐下来假设这段代码将不是一个编程练习。任何其他必须阅读的人都会认为:

  1. 他为什么使用插入排序?
  2. 他为什么重新实现插入排序?
  3. 一定是递归??大人!!
  4. 他为什么要浪费时间寻找尾调用插入算法?或者
  5. 他只是为了运行他的方法而增加了堆栈大小吗?
  6. 很好。现在我们有1000,000 项要排序,程序不断崩溃。

结论,他们将立即删除您的代码并使用Collections.sort()。 正如我所说,如果您正在进行编程练习,那么您的递归插入 排序工作直到某个时候。继续前进。

【讨论】:

  • 我在练习递归,所以我想使用递归来实现插入排序。
【解决方案2】:

默认情况下,Java 无法处理那么深 (10000) 的递归深度。考虑以下过于简化的示例仍然会引发 StackOverflowError。

static void test(int i)
{
   if (i == 0) return;
   test(i-1);
}

public static void main(String[] args)
{
   test(10000);
}

您必须指定命令行参数来实现这一点(-Xss 和可能-Xmx 以分配更多内存)。

我使用-Xmx1000m -Xss10000000 成功运行了您的算法,用于处理大小为 100000 的数组(虽然花了一些时间)。

我认为您使用递归而不是简单的双 for 循环是有原因的。

【讨论】:

  • Thanx...我尝试了 -Xss6m 参数,之后它工作正常。
猜你喜欢
  • 2016-02-12
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
  • 2018-10-21
  • 1970-01-01
  • 2021-05-06
相关资源
最近更新 更多