2013-10-02 2 views
0

Je vous écris un programme qui met en oeuvre l'algorithme de tri d'insertion pour trier un tableau:Comment: Split tout en boucle avec double comparaison en deux?

public void insertionSort() 
{ 
    int in, out; 

    for (out = 1; out < nElems; out++)  // out is dividing line 
    { 
     copies++;      
     long temp = a[out];   // remove marked item 
     in = out;      // start shifts at out 
     while (in > 0 && a[in - 1] >= temp) // until one is smaller, 
     { 
      a[in] = a[in - 1];   // shift item to right 
      --in;      // go left one position 
      ++comparissons;    
     } 
     a[in] = temp;     // insert marked item 
    } // end for 
} // end insertionSort(

Je suis également que la mise en œuvre des compteurs comptent le nombre des comparaisons sont effectuées au cours de l'algorithme. dans ma boucle while:

while (in > 0 && a[in - 1] >= temp) // until one is smaller, 
    { 
     a[in] = a[in - 1];   // shift item to right 
     --in;      // go left one position 
     ++comparissons;    
    } 

comparaison de deux sont faits, cela signifie que pour ces deux comparaison la variable 'comparissons est de incrémenté d'un (même si deux comparaisons sont en fait). Ma question est la suivante: comment décomposer cette boucle while avec deux comparaisons en deux parties afin que je puisse incrémenter des comparaisons chaque fois qu'une comparaison est faite tout en conservant la même fonctionnalité.

Merci!

JLL

Répondre

1

Faites-vous référence aux comparaisons dans la condition while? Si oui, vérifiez ces conditions séparément.

while (in > 0) // until one is smaller, 
{ 
    ++comparissons; 
    if (a[in - 1] >= temp) ++comparissons; 
    else      break; 

    a[in] = a[in - 1];   // shift item to right 
    --in;      // go left one position   
} 
+0

Génial, merci! Le code fonctionne mais j'essaie toujours de comprendre la logique. –

+0

@ J.L.Louis la condition2 à l'intérieur de la boucle while est déplacée dans une condition if pour compter les comparaisons2 effectuées par elle. Les comparaisons1 (original) sont comptées pour condition1. Aussi, vous voulez vous assurer que la boucle se brise quand la condition 2 n'est pas satisfaite – hrv

1

Déplacer la comparaison dans un cas à l'intérieur de la boucle de temps. Ou vous pouvez faire un hack comme celui-ci et déplacer l'incrément des comparaisons dans la condition elle-même.

while (in > 0 && ((a[in-1] >= temp) && (++comparisons > -1))) { 
} 
+0

Le problème persiste toujours; chaque fois que la boucle while vérifie la condition, deux comparaisons sont faites (est dans> 0? ... est un [in-1]> = temp?), mais la variable de comparaison est seulement incrémentée de 1. J'ai besoin de 'comparaison' être incrémenté chaque fois qu'une seule comparaison est faite, donc je pense que cela doit être divisé en deux parties où je peux implémenter ++ comparaisons. Merci! :) –