繁体   English   中英

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

[英]Keep getting java.lang.ArrayIndexOutOfBoundsException: 5 for my mergesort implementation

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

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

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

您也没有正确进行合并。 您有三个数组:较低的排序数组'a',较高的排序数组'b'和结果数组'r',当然也应对其进行排序。

在开始时, abarr中彼此相邻,而aarr[low ... mid]barr[mid ... high] (在这里, arr[i ... j]表示从索引i到但不包含j的子数组。)

合并之后, arr应该包含r

您将比较两个相邻的数组元素arr[i]arr[i + 1] ,但应将a的当前元素与b的当前元素进行比较,直到用尽了其中一个数组。 因此,您需要三个索引,每个数组一个。

暂无
暂无

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

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