java - 不断收到 java.lang.ArrayIndexOutOfBoundsException : 5 for my mergesort implementation

标签 java debugging mergesort

我正在尝试在不查看任何源代码的情况下实现合并排序。每当我尝试运行我的程序时,我都会收到此异常:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at Mergesort.merge_halves(Mergesort.java:40)
at Mergesort.mergesort(Mergesort.java:31)
at Mergesort.mergesort(Mergesort.java:29)
at Mergesort.main(Mergesort.java:15)

这是我的程序:

public class Mergesort {

private static int [] tempArr;

public static void main(String [] args) {
    int [] arr = new int[5];

    arr[0] = 2;
    arr[1] = 4;
    arr[2] = 9;
    arr[3] = 11;
    arr[4] = 3;

    Mergesort sorter = new Mergesort();
    sorter.mergesort(arr, arr[0], arr.length - 1);

    for(int i = 0; i < tempArr.length - 1; i++) {
        System.out.print(tempArr[i] + " ");
    }
}

public void mergesort(int [] arr, int low, int high) {
    if(low >= high) {
        return;
    }

    int mid = (low + high) / 2;

    mergesort(arr, low, mid);
    mergesort(arr, mid + 1, high);
    merge_halves(arr, low, mid, high);
}

public void merge_halves(int [] arr, int low, int mid, int high) {
    tempArr = new int[arr.length];

    int i = 0;

    while(i < tempArr.length) {
        if(arr[i] <= arr[i + 1]) {
            tempArr[i] = arr[i];
            i++;
        } else {
            tempArr[i] = arr[i + 1];
            i++;
        }
      }
   }
}

我尝试通过更改 while 循环中的条件来修复错误,以使程序正确运行

while(i < tempArr.length - 1)

但是当我编译它并打印 tempArr 时,我返回的数组缺少一个元素:

2 4 9 3

我该如何解决这个问题?

最佳答案

不确定这是否是唯一的错误,但您在第一次调用 mergeSort 时传递的是数组的第一个数字,而不是数组的第一个索引。

改变

sorter.mergesort(arr, arr[0], arr.length - 1);

sorter.mergesort(arr, 0, arr.length - 1);

其实merge_halves也有问题。当 i == tempArr.length - 1 时,arr[i + 1] 将导致 ArrayIndexOutOfBoundsException。

关于java - 不断收到 java.lang.ArrayIndexOutOfBoundsException : 5 for my mergesort implementation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32607297/

相关文章:

java - 如何使用 OpenPdf 将 HTML 转换为 Pdf

java - 从 Java 项目内部启动 .app?

c++ - 调试不会在调试器内部发生的崩溃

java - mergeSort 实现查找尝试从文件读取时不起作用的反转数量

Java如何在循环时添加到数组列表

android - 无法在 Android Studio 中调试 onPostExecute

ruby-on-rails - Rails 3.x 是否有任何调试工具栏

c - 用C语言编写没有指针的合并排序

rust - 递归特征函数的生命周期问题

java - 缓存 JDK TimeZone 实例