使用递归实现插入排序时出现Stackoverflow错误

时间:2013-02-04 19:57:50

标签: java recursion stack-overflow insertion-sort

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.

2 个答案:

答案 0 :(得分:1)

假设您的算法正确,请保持此功能不变。不要试图解决它。通常,为了摆脱堆栈溢出(同时保持递归),有两种解决方案:

但是让我们坐下来假设这段代码不是编程练习。任何其他需要阅读的人都会想:

  1. 为什么使用插入排序?
  2. 为什么重新实施 insert-sort?
  3. 是否必须递归?我的主人!!
  4. 他为什么要浪费时间寻找尾部插入算法?或者
  5. 他只是为了运行他的方法而增加了堆栈大小吗?
  6. 好。现在我们有1000,000项要排序,程序一直在崩溃。
  7. 结论,他们会立即删除您的代码并使用Collections.sort()。 正如我所说,如果你正在进行编程练习那么好,你的递归插入 排序工作直到某一点。继续前进。

答案 1 :(得分:0)

默认情况下,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的数组(尽管需要一段时间)。

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