MergeSort 的数组 OutOfBounds 异常
Array OutOfBounds Exception with MergeSort
我正在做一个简单的 MergeSort 实现,将其作为伪代码。为此,我使用 Java 泛型。但是我在第一个 for 循环的最后一个元素上得到了这样的异常。我已经做了一些改变(希望更好),但仍然不可避免地会出现这个。为什么会这样?
private Comparable[] mergesort(Comparable[] elements, int l, int r) {
if(l < r){
int m = (l + r - 1)/2;
mergesort(elements, l, m);
mergesort(elements, m + 1, r);
int i = l;
int j = m + 1;
int k = l;
Comparable[] elements1 = (Comparable[])new Comparable[l + r]; //changed from [l + r - 1] and in the function caller also mergesort(elements, elements.length - elements.length, elements.length - 1)
while(i <= m && j <= r){
if(elements[i].compareTo(elements[j]) <= 0 ){
elements1[k] = elements[i];
i++;
} else {
elements1[k] = elements[j];
j++;
}
k++;
}
for(int h = i; i <= m; h++){
elements[k + (h - i)] = elements[h];
//ArrayIndexOutOfBoundsException: 4(the length of the input array)
}
for(int h = j; h <= k - 1; h++){
elements[h] = elements1[h];
}
}
return elements;
}
虽然您的代码难以阅读,但我认为您正在比较错误的值。
for(int h = i; i <= m; h++){
^
should be h
elements[k + (h - i)] = elements[h];
//ArrayIndexOutOfBoundsException: 4(the length of the input array)
}
您使用:
for(int h = i; i <= m; h++) {
elements[k + (h - i)] = elements[h];
}
你总是增加 h
但比较 i <= m
。因为你永远不会改变 i
你有一个无限循环。
我正在做一个简单的 MergeSort 实现,将其作为伪代码。为此,我使用 Java 泛型。但是我在第一个 for 循环的最后一个元素上得到了这样的异常。我已经做了一些改变(希望更好),但仍然不可避免地会出现这个。为什么会这样?
private Comparable[] mergesort(Comparable[] elements, int l, int r) {
if(l < r){
int m = (l + r - 1)/2;
mergesort(elements, l, m);
mergesort(elements, m + 1, r);
int i = l;
int j = m + 1;
int k = l;
Comparable[] elements1 = (Comparable[])new Comparable[l + r]; //changed from [l + r - 1] and in the function caller also mergesort(elements, elements.length - elements.length, elements.length - 1)
while(i <= m && j <= r){
if(elements[i].compareTo(elements[j]) <= 0 ){
elements1[k] = elements[i];
i++;
} else {
elements1[k] = elements[j];
j++;
}
k++;
}
for(int h = i; i <= m; h++){
elements[k + (h - i)] = elements[h];
//ArrayIndexOutOfBoundsException: 4(the length of the input array)
}
for(int h = j; h <= k - 1; h++){
elements[h] = elements1[h];
}
}
return elements;
}
虽然您的代码难以阅读,但我认为您正在比较错误的值。
for(int h = i; i <= m; h++){
^
should be h
elements[k + (h - i)] = elements[h];
//ArrayIndexOutOfBoundsException: 4(the length of the input array)
}
您使用:
for(int h = i; i <= m; h++) {
elements[k + (h - i)] = elements[h];
}
你总是增加 h
但比较 i <= m
。因为你永远不会改变 i
你有一个无限循环。