繁体   English   中英

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

[英]Stackoverflow error while implementing insertion sort using recursion

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.

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

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

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

结论,他们将立即擦除您的代码并使用Collections.sort() 就像我说的,如果您正在进行编程,那就好了,您的递归插入排序工作会一直进行到一定程度。 继续。

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的数组的算法(尽管花了一段时间)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM