2016-03-04 4 views
-1

J'essaie de créer un tri d'insertion en C. Nous avons utilisé le code suivant à l'école, mais cela ne fonctionne pas.insertion trier dans c, besoin de correction

#include <stdio.h> 
    #include <conio.h> 

    int main(int argc, char const *argv[]) 
    { 
     int a[6] = {5,8,3,2,9,1}; 
     int i,j, key; 
     int countArraySize = sizeof(a)/sizeof(int); 


     for (i = 0; i < countArraySize; ++i) 
     { 
      key = a[i]; 
      j = i - 1; 

      while(j>=0 && key < a[j]) { 
       a[j+1] = a[j]; 
       j--; 
      } 

      a[j+1] = key; 
      printf("%d\n", a[j+1]); 
     } 


     return 0; 
    } 

Merci.

+0

« il ne fonctionne pas » est presque jamais une description du problème adéquat. Si vous avez besoin d'aide, prenez le temps d'expliquer votre problème plus clairement. Spécifiquement, fournissez l'entrée, le résultat/résultat attendu et le résultat/résultat réel (les deux derniers sont manquants). Et avez-vous essayé de déboguer cela (en dehors de l'affichage sur SO)? Par exemple, en utilisant un débogueur? – kaylum

+0

Je vais vous donner un indice: Votre 'printf' imprime chaque' clé' au point où elle est rencontrée dans le tableau d'entrée. Autrement dit, vous imprimez simplement les valeurs de tableau non triées. Comment pourriez-vous changer le code pour imprimer les valeurs triées à la place? – kaylum

+0

Astuce: Imprimez les valeurs de 'j' et pensez aux indices négatifs. –

Répondre

2

Le tri est correct mais vous imprimez simplement la mauvaise chose. Vous ne devriez pas imprimer pendant le tri. Comme c'est le cas, le code imprime juste chaque clé telle qu'elle est rencontrée dans l'entrée. Au lieu de cela, l'impression doit être effectuée après le tri est terminé. Enlver la printf de l'intérieur de la boucle for courant et le mettre dans une boucle séparée for après le tri a terminé:

for (i = 0; i < countArraySize; ++i) { 
    key = a[i]; 
    j = i - 1; 

    while(j>=0 && key < a[j]) { 
     a[j+1] = a[j]; 
     j--; 
    } 

    a[j+1] = key; 

    /* FOLLOWING LINE REMOVED */ 
    /* printf("%d\n", a[j+1]); */ 
} 

/* ADDED THIS BLOCK TO PRINT THE SORTED ARRAY */ 
for (i = 0; i < countArraySize; ++i) { 
    printf("%d\n", a[i]); 
} 
+0

semble que lorsque j'ai imprimé cela dans une boucle à l'étape, il n'était pas trié, donc le tri est fait seulement quand la boucle est terminée, alors nous pouvons l'imprimer. Merci de votre aide. ça a marché –