为了账号安全,请及时绑定邮箱和手机立即绑定

如何修复合并排序方法的 ArrayIndexOutOfBoundsException?

如何修复合并排序方法的 ArrayIndexOutOfBoundsException?

慕少森 2022-06-23 18:04:44
所以我遇到的问题是我试图让我的合并排序实现运行,但我不断收到一个异常错误,指出数组索引超出范围。这是一个运行时错误,因为我能够毫无问题地编译程序,并且它会一直运行,直到它遇到我的合并排序调用。我尝试的一件事是在合并方法中更改我的一个变量以匹配另一个变量(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: 15at 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 的设置大小,但我不确定如何解决这个问题。我曾尝试查看类似的问题,但我没有找到解决我遇到的问题的方法。
查看完整描述

3 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

您的代码中的其他一切都很好。


除了这条线


诠释 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 + " -- ");

    }

}

}


查看完整回答
反对 回复 2022-06-23
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

你是如何调用你的函数的?object.sort(arr, 0, A.length-1);传递数组索引的最大值时,请确保在 main 中使用。



查看完整回答
反对 回复 2022-06-23
?
四季花海

TA贡献1811条经验 获得超5个赞

 // Initial index of merged subarry array 

 int k = l; //this is L not a 1


查看完整回答
反对 回复 2022-06-23
  • 3 回答
  • 0 关注
  • 225 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号