ma fonction ne trie pas le tableau

ma fonction ne trie pas le tableau - C - Programmation

Marsh Posté le 08-01-2011 à 00:03:58    

Bonjour,  
 
j'ai fait un petit programme censé trier un tableau, écrit en langage C.  
 
Le problème est que il y a des nombres redondant et d'autres ne sont plus dans le tableau après le tri... Voici le code :
 

Code :
  1. void
  2. sort_tab(int* tab){
  3.   //int taille = sizeof(tab)/sizeof(int);
  4.   int taille = 10;
  5.   int i, ind_min, courant;
  6.   int min;
  7.  
  8.   for(courant=0; courant<taille; courant++){
  9.     min = tab[courant];
  10.     for(i=courant+1; i<taille; i++){
  11.       if(tab[i]<min){
  12.         min = tab[i];
  13.         ind_min = i;
  14.       }
  15.     }
  16.     tab[ind_min] = tab[courant];
  17.     tab[courant] = min;
  18.   }
  19. }
  20. void
  21. print_tab(int* tab){
  22.   int j;
  23.   for(j=0; j<10; j++)
  24.     printf("%d |", tab[j]);
  25.   printf("\n" );
  26. }
  27. int main(){
  28.   int i, j, taille;
  29.   //int toto[10] = {9, 1, 7, 2, 5, 3, 4, 6, 8, 0}; //TAB1
  30.   int toto[10] = {2, 3, 4, 5, 6, 7, 8, 9, 0, 1}; //TAB2
  31.   sort_tab(toto);
  32.   print_tab(toto);
  33.   return 0;
  34. }


 
voici le resultat avec TAB2 :
0 |1 |2 |3 |4 |5 |6 |7 |8 |8 |
 
voici le resultat avec TAB1
0 |1 |1 |2 |2 |3 |3 |4 |6 |8 |
 
J'aimerais savoir déjà d'ou vient ces redondances et pourquoi des nombres ont disparus ... ?
 
Merci d'avance pour votre aide.


Message édité par gilou le 08-01-2011 à 00:54:28
Reply

Marsh Posté le 08-01-2011 à 00:03:58   

Reply

Marsh Posté le 08-01-2011 à 00:08:27    

Ce sujet a été déplacé de la catégorie OS Alternatifs vers la categorie Programmation par Mikala


---------------
Intermittent du GNU
Reply

Marsh Posté le 08-01-2011 à 01:29:48    

Voici la cause du pb IMHO

Code :
  1. void
  2. sort_tab(int* tab){
  3.   //int taille = sizeof(tab)/sizeof(int);
  4.   int taille = 10;
  5.   int i, ind_min, courant;
  6.   int min;
  7.  
  8.   for(courant=0; courant<taille; courant++){
  9.     ind_min = courant; // pas initialisé si courant contenait déja la valeur min
  10.     min = tab[courant];
  11.     for(i=courant+1; i<taille; i++){
  12.       if(tab[i]<min){
  13.         min = tab[i];
  14.         ind_min = i;
  15.       }
  16.     }
  17.     tab[ind_min] = tab[courant];  // et c'était problématique ici
  18.     tab[courant] = min;
  19.   }
  20. }


 
ce code peut s'améliorer (c'est un tri bulle, si j'ai bien lu):
 

Code :
  1. void  sort_tab(int* tab){
  2.   int taille = 10;
  3.   int courant;
  4.  
  5.   for (courant = 0; courant < taille; courant++) {
  6.     int ind_min = courant;                            // autant déclarer seulement quand c'est necessaire
  7.     int min = tab[courant];                           // idem
  8.     int i;                                            // idem
  9.     for (i = courant+1; i < taille; i++) {
  10.       if (tab[i] < min) {
  11.          min = tab[i];
  12.          ind_min = i;
  13.        }
  14.      }
  15.     if (min != tab[courant]) {  // pas la peine de faire l'assignation si courant contenait déjà le min
  16.       tab[ind_min] = tab[courant];
  17.       tab[courant] = min;
  18.     }
  19.   }
  20. }


On peut aussi se débarrasser de min et n'utiliser que ind_min:

Code :
  1. void  sort_tab(int* tab){
  2.   int taille = 10;
  3.   int courant;
  4.  
  5.   for (courant = 0; courant < taille; courant++) {
  6.     int ind_min = courant;
  7.     int i;
  8.     for (i = courant+1; i < taille; i++) {
  9.       if (tab[i] < tab[ind_min]) {
  10.          ind_min = i;
  11.        }
  12.      }
  13.     if (ind_min != courant) {
  14.       int temp = tab[ind_min];
  15.       tab[ind_min] = tab[courant];
  16.       tab[courant] = temp;
  17.     }
  18.   }
  19. }


A+,


Message édité par gilou le 08-01-2011 à 01:42:38

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 08-01-2011 à 01:36:04    

Quand tu as ce genre de probleme (blocage sur un algo), l'utilisation d'un debugger (genre gdb) peut s'avérer extrement pratique. Dans tout les cas, tu pourras tres difficilement t'en passer si tu continues a programmer (notamment des programmes plus long) - c'est toujours utile d'apprendre a s'en servir!
 
Sinon, sans te donner la solution, regarde du cote de la variable "ind_min" (il te manque une seul instruction).
 
 
Edit: bon bah griller pas gillou !


Message édité par mr simon le 08-01-2011 à 01:36:58
Reply

Marsh Posté le 08-01-2011 à 01:48:53    

Et moi, depuis que je suis sur une becane de secours poussive, j'ai plus ni compilo, ni debugger :p
 
 ;)  
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 08-01-2011 à 12:13:22    

Merci pour ta réponse mr simon, effectivement j'ai oublié d'initialiser ind_min ... j'ai réparé l'erreur et là ca fonctionne bien. J'ai pas l'habitude d'utiliser un dbg mais je vais m'y mettre.

Reply

Sujets relatifs:

Leave a Replay

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