2010-10-02 19 views
1

J'ai des problèmes avec le fond mergesort. J'ai des problèmes de tri/fusion. Code actuel comprend:Bottoms-up problèmes de fusion!

public void mergeSort(long[] a, int len) { 
     long[] temp = new long[a.length]; 
     int length = 1; 
     while (length < len) { 
      mergepass(a, temp, length, len); 
      length *= 2; 
     } 
    } 


    public void mergepass(long[] a, long[] temp, int blocksize, int len) { 
     int k = 0; 
     int i = 1; 
     while(i <= (len/blocksize)){ 
      if(blocksize == 1){break;} 
      int min = a.length; 
      for(int j = 0; j < blocksize; j++){ 
       if(a[i*j] < min){ 
        temp[k++] = a[i*j]; 
        count++; 
       } 
       else{ 
        temp[k++] = a[(i*j)+1]; 
        count++; 
       } 
      } 
      for(int n = 0; n < this.a.length; n++){ 
       a[n] = temp[n]; 
      } 
     } 
    } 
+1

-1 Sujet peu utile. Deuxième phrase inutile. On dirait que les devoirs aussi. –

Répondre

2

problèmes évidents:

  • i est jamais incrémentée.
  • À aucun moment, vous ne comparez deux éléments du tableau. (Est-ce que c'est ce que if(a[i*j] < min) est supposé faire?) Je ne peux pas dire.)
  • Pourquoi multipliez-vous i et j?
  • Qu'est-ce que this.a.length?

problèmes de style:

  • mergeSort() se len comme argument, même si les tableaux ont une longueur implicite. Pour aggraver les choses, la fonction utilise également a.length et length.
  • Noms de variables généralement médiocres.

nitpicks:

  • Si vous allez faire un second réseau de la même taille, il est courant de faire une « source » et l'autre la « destination » et de les échanger entre passe, au lieu de trier dans un tableau temporaire et de les copier à nouveau.