亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何修復合并排序方法的 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 關注
  • 221 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號