Как исправить ArrayIndexOutOfBoundsException для метода сортировки слиянием? - PullRequest
0 голосов
/ 18 февраля 2019

Итак, проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь запустить реализацию сортировки слиянием, но получаю сообщение об ошибке исключения, которая говорит о том, что индекс массива выходит за пределы.Это ошибка во время выполнения, потому что я могу без проблем скомпилировать программу, и она будет работать до тех пор, пока не достигнет моего вызова сортировки слиянием.Одна вещь, которую я попытался, это изменить одну из моих переменных, чтобы она соответствовала другой в методе слияния (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, но я не уверено том, как исправить эту проблему.Я пытался смотреть на подобные проблемы, но я не видел решения проблемы, с которой я столкнулся.

Ответы [ 3 ]

0 голосов
/ 18 февраля 2019

вот пример

 // Initial index of merged subarry array 
 int k = l; //this is L not a 1
0 голосов
/ 18 февраля 2019

В вашем коде все остальное нормально.

За исключением этой строки

int k = 1;// line39

это должно быть 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 + " -- ");
    }
}
}
0 голосов
/ 18 февраля 2019

Как вы вызываете свою функцию?Убедитесь, что вы используете object.sort(arr, 0, A.length-1); в основном, когда вы передаете максимальное значение индекса массива.

...