[英]Getting java.lang.ArrayIndexOutOfBoundsException: 2 >= 2
[英]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',当然也应对其进行排序。
在开始时, a
和b
在arr
中彼此相邻,而a
在arr[low ... mid]
, b
在arr[mid ... high]
。 (在这里, arr[i ... j]
表示从索引i
到但不包含j
的子数组。)
合并之后, arr
应该包含r
。
您将比较两个相邻的数组元素arr[i]
和arr[i + 1]
,但应将a
的当前元素与b
的当前元素进行比较,直到用尽了其中一个数组。 因此,您需要三个索引,每个数组一个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.