1
votes

Comment réparer ArrayIndexOutOfBoundsException pour une méthode de tri Merge?

Le problème que je rencontre est que j'essaie de faire exécuter mon implémentation de tri de fusion, mais j'obtiens toujours une erreur d'exception qui indique que l'index Array est hors limites. Il s'agit d'une erreur d'exécution car je suis capable de compiler le programme sans problème et il fonctionnera jusqu'à ce qu'il atteigne mon appel de tri de fusion. Une chose que j'ai essayée était de changer l'une de mes variables pour qu'elle corresponde à l'autre dans la méthode de fusion (int k = 0; // ligne 39). Quand j'ai fait cela, le code s'est exécuté, cependant, le tableau trié par fusion n'était pas correct. J'ai même essayé de déboguer le code, mais je n'ai pas vu de problème avec celui-ci. Voici mon code:

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

Et voici l'erreur:

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++;
   }
}

Je comprends que cela signifie que le tableau sort du définir la taille de 15 mais je ne sais pas comment résoudre ce problème. J'ai essayé d'examiner des problèmes similaires, mais je n'ai pas vu de solution au problème que je rencontrais.


8 commentaires

ressembler à un problème peut être à la ligne 60 A [k] parce que k index commence à 1.


vous pouvez comparer ici geeksforgeeks.org/merge-sort


Je l'avais changé pour commencer à 0, mais le tableau ne s'est pas imprimé correctement. Voici un exemple: Voici la liste saisie: [12, 21, 32, 36, 14, 10, 11, 5, 55, 16, 31, 7, 57, 89, 78] Veuillez saisir une valeur que vous souhaitez rechercher pour dans la liste. 5 Tableau trié rapide: [5, 7, 10, 11, 12, 14, 16, 21, 31, 32, 36, 55, 57, 78, 89] Tableau trié par fusion: [31, 31, 32, 32, 36 , 36, 55, 55, 57, 57, 78, 78, 89, 21, 89] Recherche binaire => Élément introuvable. Recherche d'interpolation => Élément introuvable.


remplacez celui-ci int m = l + (r-l) / 2;


Pouvez-vous expliquer pourquoi? Je suis un peu confus


Je viens de faire ce changement et c'est toujours la même erreur.


référez-vous à ce lien geeksforgeeks.org/merge-sort ils vous donnent une bonne explication.


continuons cette discussion dans le chat .


3 Réponses :


0
votes

Comment appelez-vous votre fonction? Assurez-vous que vous utilisez object.sort (arr, 0, A.length-1); dans main lorsque vous passez la valeur maximale de l'index du tableau.


1 commentaires

Donc je l'appelle juste comme merge_sort (array, 0, 14);



0
votes

exemple ici

 // Initial index of merged subarry array 
 int k = l; //this is L not a 1


0 commentaires

1
votes

Tout le reste est bien dans votre code.

Sauf pour cette ligne

int k = 1; // line39

cela devrait être k = l (La lettre 'L' en petites majuscules)

Vous pouvez vous référer au code suivant

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 commentaires