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

标签 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.

最佳答案

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

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

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

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

关于java - 使用递归实现插入排序时出现 Stackoverflow 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14694517/

相关文章:

c# - 另一个快速排序计算器

java - Netbeans GUI 编程

java - Red5 RTMPT 不工作

java - 如何使用多线程访问结果集值

python - 根到叶算法错误

c - 通过堆栈溢出重定向指令指针

java - 使用字符串生成器将 XML 放入单个 csv/xls 列中不起作用

performance - Haskell 性能 : Struggling with utilizing profiling results and basic tuning techniques (eliminating explicit recursion, 等)

algorithm - 用迭代代替递归

c - 为什么 putenv(buf) 无法正常工作,因为 memcpy(buf + 92, "\x00\x14\xe4\xf7", 4) 将 a\x00 字节复制到 buf ?