Java - 二进制插入排序 StackOverFlowError

标签 java data-structures

我正在尝试用java编写二进制插入排序。


    public static int binarySearch(double[] a, int max, int min, double k) {
      if (max == min) 
         return (k > a[min]) ? (min + 1) : min;
      int mid = (max + min) / 2;
      if (k == a[mid])
         return mid;
      else if (k < a[mid])
         return binarySearch(a, mid - 1, min, k);
      else
         return binarySearch(a, max, mid + 1, k);
   }

   public static void binaryInsertionSort(double[] a) {
      // TODO!!!
      for(int i = 1; i < a.length; ++i) {
         int  j = i - 1;
         double tmp = a[i];
         int l = binarySearch(a, j, 0, tmp);
         while(j >= l) {
            a[j + 1] = a[j];
            --j;
         }
         a[l] = tmp;
      }
   }

但是当我用

测试它时
      a = new double[] {1., 3., 2.};
      DoubleSorting.binaryInsertionSort (a);

它返回java.lang.StackOverflowError。我在 C++ 中使用了几乎相同的代码,使用相同的输入对其进行了测试,并且工作正常。但我不知道为什么它在Java中不起作用。

最佳答案

您应该提供一个不同的示例。像 {4., 3., 2.} 这样的序列会发生 stackoverflow 错误,而 {1., 3., 2.} 似乎没有明显的问题。

与其他序列一起运行它会导致对 binarySearch 方法进行以下调用:

[4.0, 3.0, 2.0], 0, 0, 3.0
[3.0, 4.0, 2.0], 1, 0, 2.0
[3.0, 4.0, 2.0], -1, 0, 2.0

之后,它会继续重复上次调用,直到堆栈溢出。 据我理解你的想法,你不想在这里传递-1,所以你可以只改变一行:

return binarySearch(a, Math.max(0, mid - 1), min, k);

下次遇到此类问题时,我建议您使用调试器,可能还需要结合一些额外的 System.out

关于Java - 二进制插入排序 StackOverFlowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60307524/

相关文章:

java - Java 中的后置增量

c++ - [c++/pointers] : having objects A and B (B has vector member, 存储指向 A 的指针),知道 A 是否可以检索指向 B 的指针?

java - 需要有关 java map 和 javabean 的帮助

java - 由于外键的空值而无法从表中获取数据

java - 检索firebase实时数据库中节点下的所有数据

java - java中如何处理两个jar文件?

java - Java 中 map 中的重复条目

c++ - 在不是围绕您要查找的数据类型构建的二叉树中查找数据

c# - 在 C# 或 Java 中对 MruList 进行高效建模

java - Spring Boot + Thymeleaf 错误 java.lang.ClassNotFoundException : org. thymeleaf.dom.Attribute