Petit problème avec mon algo de tri !

Petit problème avec mon algo de tri ! - C++ - Programmation

Marsh Posté le 12-12-2007 à 22:50:43    

Bonjeoir  !
 
Mon algo de tri par tas ne fonctionne pas à 100%: le début du tas n'est pas bien trié et je ne comprends toujours pas pourquoi après y avoir passé 2h dessus !  :fou:  
 
La fonction "échanger" échange les 2 éléments dans le tableau tas.
Le code n'est pas commenté mais il n'est pas long, et pas dur je pense (je débute là dedans).
 

Code :
  1. void tri_tas(int tas[], int debut, int fin)
  2. {
  3. int i;
  4. int taille = fin;
  5. for(i=taille/2; i>0; i--)
  6. {
  7.  arranger(tas, i, taille);
  8. }
  9. echanger(tas, taille, 1);
  10. taille--;
  11. i=1;
  12. while(i<=taille/2)
  13. {
  14.  arranger(tas, i, taille);
  15.  echanger(tas, taille, 1);
  16.  taille--;
  17. }
  18. }
  19. void arranger(int tas[], int i, int taille)
  20. {
  21. int j=2*i;
  22. while(j<=taille)
  23. {
  24.  if(j+1<taille && tas[j] < tas[j+1])
  25.  {
  26.   j++;
  27.  }
  28.  if(tas[i] < tas[j])
  29.  {
  30.   echanger(tas, j, i);
  31.  }
  32.  i=j;
  33.  j*=2;
  34. }
  35. }


 
Exemple d'execution avec un tableau aléatoire de 20 éléments en entrée (le bon tri est le premier) :

Code :
  1. Le tableau trié par le tri rapide est :
  2. 0 , 2 , 2 , 3 , 4 , 6 , 6 , 7 , 9 , 9 , 11 , 13 , 13 , 14 , 15 , 15 , 18 , 18 , 18 , 19
  3. Le tableau trié par le tri par tas est :
  4. 6 , 0 , 0 , 0 , 2 , 2 , 3 , 4 , 6 , 7 , 9 , 9 , 11 , 13 , 13 , 14 , 15 , 15 , 18 , 18


 
Le 19 est parti je ne sais pas où et j'ai des 0 qui apparaissent...
 
Des idées ?
 
Au passage, si vous avez des remarques sur la façons de programmer ça, je suis preneur, je début en C++.
 
Merci d'avance !


Message édité par Fused le 12-12-2007 à 23:00:15
Reply

Marsh Posté le 12-12-2007 à 22:50:43   

Reply

Marsh Posté le 13-12-2007 à 01:15:31    

Heu, alors en survolant ton algo.
 
   1. void tri_tas(int tas[], int debut, int fin)
   2. {
   3. int i;
   4. int taille = fin;
 
Ici, taille ne sera jamais égal à zéro car toujours >= 1, à moins d'avoir un seul élément. i ne peut pas être égal à zéro à cause de (i>0).
 
   5.
   6. for(i=taille/2; i>0; i--)
   7. {
   8.  arranger(tas, i, taille);
   9. }
  10.
  11. echanger(tas, taille, 1);
  12. taille--;
  13. i=1;
  14.
 
 
Si taille était égal à zéro, on ne passe pas dans la boucle, parce (1 <= 0) <=> false
 
  15. while(i<=taille/2)
  16. {
  17.  arranger(tas, i, taille);
  18.  echanger(tas, taille, 1);
  19.  taille--;
  20. }
  21. }
 
De plus i a l'air constant dans ta boucle donc c'est équivalent à écrire.
 
# while(1<=taille/2)
# {
#  arranger(tas, 1, taille);
#  echanger(tas, taille, 1);
#  taille--;
# }
# }
 
Donc, en gros tes fonctions arranger et échanger ne prennent jamais pour argument 0, donc le premier élément. Cela peut-être le problème à moins que tu effectues des modifcations à i - 1 dans ces fonctions, mais j'ai pas envie de vérifier.

Reply

Marsh Posté le 13-12-2007 à 14:40:43    

Merci, pour tes remarques, je commence à voir la solution.
 
Mon tableau possède "fin"+1 case et les données sont stockées dans les cases de 1 à "fin"+1, donc "fin" données.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed