Java 如何修复合并排序方法的ArrayIndexOutOfBoundsException?
因此,我遇到的问题是,我试图让我的合并排序实现运行,但我不断得到一个异常错误,表示数组索引超出了范围。这是一个运行时错误,因为我可以毫无问题地编译程序,并且它将一直运行,直到遇到我的合并排序调用为止。我尝试的一件事是在merge方法中更改一个变量以匹配另一个变量(int k=0;//第39行)。当我这样做时,代码运行了,但是,合并排序数组不正确。我甚至试着调试代码,但看不出有什么问题。下面是我的代码:Java 如何修复合并排序方法的ArrayIndexOutOfBoundsException?,java,indexoutofboundsexception,mergesort,Java,Indexoutofboundsexception,Mergesort,因此,我遇到的问题是,我试图让我的合并排序实现运行,但我不断得到一个异常错误,表示数组索引超出了范围。这是一个运行时错误,因为我可以毫无问题地编译程序,并且它将一直运行,直到遇到我的合并排序调用为止。我尝试的一件事是在merge方法中更改一个变量以匹配另一个变量(int k=0;//第39行)。当我这样做时,代码运行了,但是,合并排序数组不正确。我甚至试着调试代码,但看不出有什么问题。下面是我的代码: public static void merge_sort(int A[], int l, i
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++;
}
}
我知道这意味着阵列超出了15的设置大小,但我不确定如何解决此问题。我尝试过研究类似的问题,但没有找到解决问题的方法。如何调用函数?确保使用的是
object.sort(arr,0,A.length-1)当您传递数组索引的最大值时,在main中输入code>。
代码中的其他一切都很好
除了这条线
int k=1//第39行
这应该是k=l(小写字母“l”)
您可以参考以下代码
public class StackExchange {
public static
void mergeSort(int A[], int l , int r) {
if (l < r) {
int m = (l+r)/2;
mergeSort(A, l , m);
mergeSort(A, m+1, r);
merge(A, l, m, r);
}
}
private 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, j = 0 , k = l;
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];
j++;
k++;
}
}
public static void main (String...s) {
int array[] = new int[] {12, 21, 32, 36, 14, 10, 11, 5, 55, 16, 31, 7, 57, 89, 78};
mergeSort(array, 0, array.length - 1);
printArray(array);
}
private static void printArray(int array[]) {
for (int i : array) {
System.out.println(i + " -- ");
}
}
}
公共类StackExchange{
公共静电
无效合并排序(int A[],int l,int r){
if(l if(L[i]所以我只是把它称为merge_sort(array,0,14);看起来问题可能在第60行A[k],因为k索引从1开始。你可以从这里进行比较,我将它切换为从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,36,55,55,57,57,78,78,89]二进制搜索=>未找到元素。插值搜索=>未找到元素。替换这一个int m=l+(r-l)/2、 请参考geeksforgeks.org/merge-sort链接,他们会给你一个很好的解释。
// Initial index of merged subarry array
int k = l; //this is L not a 1
public class StackExchange {
public static
void mergeSort(int A[], int l , int r) {
if (l < r) {
int m = (l+r)/2;
mergeSort(A, l , m);
mergeSort(A, m+1, r);
merge(A, l, m, r);
}
}
private 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, j = 0 , k = l;
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];
j++;
k++;
}
}
public static void main (String...s) {
int array[] = new int[] {12, 21, 32, 36, 14, 10, 11, 5, 55, 16, 31, 7, 57, 89, 78};
mergeSort(array, 0, array.length - 1);
printArray(array);
}
private static void printArray(int array[]) {
for (int i : array) {
System.out.println(i + " -- ");
}
}
}