【发布时间】:2019-02-18 03:51:39
【问题描述】:
所以我遇到的问题是我试图让我的合并排序实现运行,但我不断收到一个异常错误,指出数组索引超出范围。这是一个运行时错误,因为我能够毫无问题地编译程序,并且它会一直运行,直到它遇到我的合并排序调用。我尝试的一件事是在合并方法中更改我的一个变量以匹配另一个变量(int k = 0;//第 39 行)。当我这样做时,代码运行了,但是,合并排序的数组不正确。我什至尝试调试代码,但看不到它的问题。以下是我的代码:
public static void merge_sort(int A[], int l, int r){
if(l < r){
int m = (l + r)/2;
merge_sort(A, l, m);
merge_sort(A, m + 1, r);
merge(A, l, m, r);//Line17
}
}
public static void merge(int A[], int l, int m, int r){
int n1 = m - l + 1;
int n2 = r - m;
int L[] = new int [n1];
int R[] = new int [n2];
for(int i = 0; i < n1; i++){
L[i] = A[l + i];
}
for(int j = 0; j < n2; j++){
R[j] = A[m + 1 + j];
}
int i = 0;
int j = 0;
int k = 1; //line39
while(i < n1 && j < n2){
if(L[i] <= R[j]){
A[k] = L[i];
i++;
}
else{
A[k] = R[j];
j++;
}
k++;
}
while(i < n1){
A[k] = L[i];
i++;
k++;
}
while(j < n2){
A[k] = R[j]; //line60
j++;
k++;
}
}
这是错误:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 15
at HW3.merge(HW3.java:60)
at HW3.merge_sort(HW3.java:17)
at HW3.main(HW3.java:160) //this line is where I call the method within the main
我了解这意味着数组超出了设置的 15 大小,但我不确定如何解决此问题。我曾尝试查看类似的问题,但没有找到解决我遇到的问题的方法。
【问题讨论】:
-
看起来问题可能在第 60 A[k] 行,因为 k 索引从 1 开始。
-
你可以从这里比较geeksforgeeks.org/merge-sort
-
我已将其切换为从 0 开始,但数组打印不正确。这是一个示例: 这是输入的列表:[12, 21, 32, 36, 14, 10, 11, 5, 55, 16, 31, 7, 57, 89, 78] 请输入您要搜索的值在列表中。 5 快速排序数组:[5, 7, 10, 11, 12, 14, 16, 21, 31, 32, 36, 55, 57, 78, 89] 合并排序数组: [31, 31, 32, 32, 36 , 36, 55, 55, 57, 57, 78, 78, 89, 21, 89] 二进制搜索 => 未找到元素。插值搜索 => 未找到元素。
-
替换这一个 int m = l+(r-l)/2;
-
参考这个链接 geeksforgeeks.org/merge-sort 他们给你一个很好的解释。
标签: java indexoutofboundsexception mergesort