2017-08-29 2 views
1

Problème lié à l'utilisation de mergeSort. Je reçois une exception dans le fil "principal" java.lang.ArrayIndexOutOfBoundsException: 1 La partie mergeSort fonctionne très bien mais le réassemblage des tableaux est difficile pour moi. Toute aide serait grandement appréciée.mergeSort ArrayIndexOutOfBoundsExecption

public class MyMergeSort { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     int[] arry1 = {42, 12, 30, 77, 590, 1}; 
     int[] arry2 = mergeSort(arry1); 
     System.out.println("Merge Sort Demo: "); 
     for(int i:arry2){ 
      System.out.print(i); 
      System.out.print(" "); 
     } 
     } 

     static int[] mergeSort(int[] arry1) { 

     int n = arry1.length; 
     if(n < 2) 
      return arry1; 

     int mid = n/2; 
     int left[] = new int[mid]; 
     int right[] = new int [n - mid]; 
     for(int i = 0; i< mid; i++) { 
      left[i] = arry1[i]; 
     } 
     for(int i = mid; i < n; i++) { 
      right[i - mid] = arry1[i]; 
     } 
     mergeSort(left); 
     mergeSort(right); 
     merge(arry1, left, right); 
     return(arry1); 
     } 

     public static void merge(int[] arry1, int left[], int right[]){ 
     int nL = left.length; 
     int nR = right.length; 
     int i = 0, j = 0, k= 0; 

     while(i < nL && j < nR) { 
      if(left[i] < right[j]){ 
      arry1[k] = left[i]; 
      i++; 
      } else { 
      arry1[k] = right[i]; 
      j++; 
      } 
      k++; 
     } 
     while(i < nL) { 
      arry1[k] = left[i]; 
      i++; 
      k++; 
     } 
     while(j < nR){ 
      arry1[k] = right[i]; 
      j++; 
      k++; 
     } 
    } 
} 

Répondre

2

Dans votre méthode de fusion devrait être ce arry1 [k] = [j] droit;

public static void merge(int[] arry1, int left[], int right[]){ 
    int nL = left.length; 
    int nR = right.length; 
    int i = 0, j = 0, k= 0; 

    while(i < nL && j < nR) { 
     if(left[i] < right[j]){ 
     arry1[k] = left[i]; 
     i++; 
     } else { 
     **arry1[k] = right[i];** // Why i it should be j 
     j++; 
     } 
     k++; 
    } 
    while(i < nL) { 
     arry1[k] = left[i]; 
     i++; 
     k++; 
    } 
    while(j < nR){ 
     **arry1[k] = right[i];** // Why i it should be j 
     j++; 
     k++; 
    } 
} 

je crois que j est pour celui de droite, vous augmenterez j et avez condition sur seulement mais l'accès à l'index i de droite plutôt que l'indice jème. J'espère que cela aide!

+0

Merci beaucoup! Je suis content que la question était si simple – 7kevin

+0

Vous pouvez upvote et accepter la réponse: P –

+0

lol désolé à ce sujet. Il fonctionne parfaitement sur eclipse mais la section java du tuteur python dit que ça prend trop de temps. Je cours aussi du code là-bas donc je peux regarder les exécutions pas à pas. Aucune suggestion? – 7kevin