ArrayOutOfBounds 异常合并排序
ArrayOutOfBounds Exception Merge Sort
我正在处理合并排序,并抛出了 ArrayIndexOutOfBoundsException
。我一直在梳理代码寻找错误但找不到它。异常堆栈跟踪表明它来自第 77 行的合并函数,即 temp[current3++] = list2[current2++];
。第 102 行是 merge(firstHalf, secondHalf, list);
,第 93 行是 mergeSortRoutine(firstHalf);
。非常感谢任何帮助。感谢您的时间。
下面是两个函数:
//this function will merge two arrays
private static void merge(Integer[] list1, Integer[] list2, Integer[] temp){
int current1 = 0; //current index in list1
int current2 = 0; //current index in list2
int current3 = 0; //current index in temp
while((current1 < list1.length) && (current2 < list2.length)){
if(list1[current1].intValue() < list2[current2].intValue()){
temp[current3++] = list1[current1++];
}
else{
temp[current3++] = list2[current2++];
}
}
while(current1 < list1.length){
temp[current3++] = list2[current2++];
}
while(current2 < list2.length) {
temp[current3++] = list2[current2++];
}
}
//merge sort function
private static void mergeSortRoutine(Integer[] list){
if(list.length > 1){
//merge sort the first half
Integer[] firstHalf = new Integer[(list.length)/2];
System.arraycopy(list, 0, firstHalf, 0, (list.length)/2);
mergeSortRoutine(firstHalf);
//merge sort the second half
int secondHalfLength = list.length - ((list.length)/2);
Integer[] secondHalf = new Integer[secondHalfLength];
System.arraycopy(list, (list.length)/2, secondHalf, 0, secondHalfLength);
mergeSortRoutine(secondHalf);
//merge firstHalf with secondHalf into list
merge(firstHalf, secondHalf, list);
}
}
下面是堆栈跟踪:
java.lang.ArrayIndexOutOfBoundsException: 1
at Merge.merge(Merge.java:77)
at Merge.mergeSortRoutine(Merge.java:102)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.main(Merge.java:27)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
正如 Scary Wombat 所说,在最后的 while
循环中,您正在检查 current2 然后递增它。
除此之外,您还在 second-to-last while
循环 while(current1 < list1.length)
中递增 current2
。我认为您可能希望该声明是 temp[current3++] = list1[current1++]
.
我正在处理合并排序,并抛出了 ArrayIndexOutOfBoundsException
。我一直在梳理代码寻找错误但找不到它。异常堆栈跟踪表明它来自第 77 行的合并函数,即 temp[current3++] = list2[current2++];
。第 102 行是 merge(firstHalf, secondHalf, list);
,第 93 行是 mergeSortRoutine(firstHalf);
。非常感谢任何帮助。感谢您的时间。
下面是两个函数:
//this function will merge two arrays
private static void merge(Integer[] list1, Integer[] list2, Integer[] temp){
int current1 = 0; //current index in list1
int current2 = 0; //current index in list2
int current3 = 0; //current index in temp
while((current1 < list1.length) && (current2 < list2.length)){
if(list1[current1].intValue() < list2[current2].intValue()){
temp[current3++] = list1[current1++];
}
else{
temp[current3++] = list2[current2++];
}
}
while(current1 < list1.length){
temp[current3++] = list2[current2++];
}
while(current2 < list2.length) {
temp[current3++] = list2[current2++];
}
}
//merge sort function
private static void mergeSortRoutine(Integer[] list){
if(list.length > 1){
//merge sort the first half
Integer[] firstHalf = new Integer[(list.length)/2];
System.arraycopy(list, 0, firstHalf, 0, (list.length)/2);
mergeSortRoutine(firstHalf);
//merge sort the second half
int secondHalfLength = list.length - ((list.length)/2);
Integer[] secondHalf = new Integer[secondHalfLength];
System.arraycopy(list, (list.length)/2, secondHalf, 0, secondHalfLength);
mergeSortRoutine(secondHalf);
//merge firstHalf with secondHalf into list
merge(firstHalf, secondHalf, list);
}
}
下面是堆栈跟踪:
java.lang.ArrayIndexOutOfBoundsException: 1
at Merge.merge(Merge.java:77)
at Merge.mergeSortRoutine(Merge.java:102)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.main(Merge.java:27)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
正如 Scary Wombat 所说,在最后的 while
循环中,您正在检查 current2 然后递增它。
除此之外,您还在 second-to-last while
循环 while(current1 < list1.length)
中递增 current2
。我认为您可能希望该声明是 temp[current3++] = list1[current1++]
.