继续为我的mergesort实现获取java.lang.ArrayIndexOutOfBoundsException:5

时间:2015-09-16 11:27:10

标签: java debugging mergesort

我试图在不查看任何源代码的情况下实现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

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

不确定这是否是唯一的错误,但是您在第一次调用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。

答案 1 :(得分:2)

缺少的元素来自您的打印方式:您显式循环到array.length - 1.

您的合并功能不会合并任何内容。您应该首先将arr复制到temp,然后再次按arr顺序组合元素。 (或者在temp中组装它们然后复制回arr。)你的工作数组应该始终是arr。

您也没有正确合并。你有三个数组:下排序数组'a',上排序数组'b'和结果数组'r',当然也应该排序。

开头nab彼此相邻,arr中的aarr[low ... mid]中的b }}。 (此处,arr[mid ... high]表示从索引arr[i ... j]到最终但不包含i的子数组。)

合并后,j应包含arr

您比较了两个相邻的数组元素rarr[i],但是您应该将arr[i + 1]的当前元素与a的当前元素进行比较,直到您耗尽其中一个数组。所以你需要三个索引,每个数组一个。