2013-04-14 4 views
0

c'est le code pour le mergeSort, ceci donne une erreur stackoverflow dans la ligne 53 et 54 (mergeSort (l, m); et mergeSort (m, h);) Toute aide sera considérée comme si précieuse , s'il vous plaît aidez-moi, je suis désemparé, merci.MergeSort donne l'erreur StackOverflow

package codejam; 

public class vector { 
    static int[] a; 
    static int[] b; 
    public static void main(String[] args) { 
    int[] a1 = {12,33,2,1}; 
    int[] b1 = {12,333,11,1}; 
     mergeSort(0,a1.length); 
     a1=b1; 
     mergeSort(0,b1.length); 
     for (int i = 0; i < a1.length; i++) { 
      System.out.println(a[i]); 
     } 

    } 

    public static void merge(int l,int m,int h) { 
     int n1=m-l+1; 
     int n2 = h-m+1; 
     int[] left = new int[n1]; 
     int[] right = new int[n2]; 
     int k=l; 
     for (int i = 0; i < n1 ; i++) { 
      left[i] = a[k]; 
      k++; 
     } 
     for (int i = 0; i < n2; i++) { 
      right[i] = a[k]; 
      k++; 
     } 
     left[n1] = 100000000; 
     right[n1] = 10000000; 
     int i=0,j=0; 
     for (k =l ; k < h; k++) { 
      if(left[i]>=right[j]) 
      { 
       a[k] = right[j]; 
       j++; 
      } 
      else 
      { 
       a[k] = left[i]; 
       i++; 
      } 
     } 
    } 

    public static void mergeSort(int l,int h) { 
    int m =(l+h)/2; 
    if(l<h) 
    { 
     mergeSort(l,m); 
     mergeSort(m,h); 
     merge(l,m,h);; 
    } 

    } 
} 

Répondre

1

ci-après le tableau des itérations récursif de la fonction mergesort avec l'argument l = 0 et h = 4

enter image description here

lorsque la valeur de l est égal à 0 et la valeur de h est égal à 1, l'expression calculer la valeur m qui s'avère être 0 mais nous vérifions la condition avec h qui est toujours 1 donc 0 < 1 devient vrai, les appels récursifs de cette fonction mergeSort forment un motif, ce motif ne laisse pas la fonction se terminer, la pile fonctionne Mémoire insuffisante, provoque une erreur de stackoverflow.