Partage
  • Partager sur Facebook
  • Partager sur Twitter

Exercice 5 - Trier valeurs tableau

PB

    24 novembre 2020 à 1:47:20

    Bonsoir tout le monde !

    j'ai besoin d'un regard un peu plus expérimenté et je vous remercie d'avance pour votre aide

    Je bloque sur l'exo 5, je vous joins en dessous  mon code pour trier les valeurs d'un tableau dans l'ordre croissant.

    Le code fonctionne lorsque mon tableau est composé de 4 valeurs mais pas plus. Au delà, il m'affiche les valeurs dans l'ordre de départ. Est ce que vous pourriez m'aider à comprendre, j'ai essayé pas mal de choses et je commence à m'embrouiller :) Merci beaucoup!

    void ordonnerTableau(int tableau[], int tailleTableau);
    
    
    void ordonnerTableau(int tableau[], int tailleTableau)
    {
        int i;
        int j;
        int suiteOrdreCroissant;
    
        while (suiteOrdreCroissant!=0)  
        {
            for (i=0; i<tailleTableau; i++)  
            {
                if (tableau[i]>tableau[i+1])   
                {
                    j = tableau[i];   
                    tableau[i] = tableau[i+1]; 
                    tableau[i+1]= j;  
                    i = tailleTableau+1;
                    suiteOrdreCroissant = 1; 
                }
                else
                {
                    suiteOrdreCroissant = 0;
                }
            }
    
        }
        for (i=0; i<tailleTableau; i++)
        {
            printf("%d\n", tableau[i]);
        }
    
     
    • Partager sur Facebook
    • Partager sur Twitter
      24 novembre 2020 à 2:08:56

      Salut,
      Où as-tu pris cet algorithme de tri? Ça ressemble à un tri à bulles.
      Que vaut suiteOrdreCroissant avant le while? N'importe quoi, mais il y a des chances que ce soit 0.
      Pour tester un tri en ordre croissant, il est bon d'initialiser le tableau en ordre décroissant.
      Dans un tri à bulle, la première itération ne fait que déplacer le plus grand à la dernière position, c'est tout.
      L'idée est de recommencer sur les N-1 premières positions pour que le 2ième plus grand soit l'avant dernier.
      Et ainsi de suite ...
      J'abandonnerais l'idée du flag suiteOrdreCroissant.
      • Partager sur Facebook
      • Partager sur Twitter

      Le Tout est souvent plus grand que la somme de ses parties.

        24 novembre 2020 à 9:39:27

        Salut, 

        Je te remercie pour ton retour!

        Je n'ai pas vraiment "trouvé" ce code, j'ai lu énormément sur les forums, des vidéos youtube et j'ai taté par moi même. C'est le premier code parmi tout ce que j'ai testé qui m'a donné un résultat

        Avec la première boucle while, j'ai voulu dire : tant que tous les nombres ne sont pas classés, tu recommences. je pensais avoir mis en place une boucle avec booléens. Mais effectivement je n'ai pas initialisé de valeur. Quand j'enlève le while, avec le booleen, ca ne fonctionne plus du tout et me donne les nombres dans l'ordre de base 

        Je ne comprend pas parce que avec 4 valeurs ou moins, ca fonctionne, mais avec plus, ca ne fonctionne plus du tout. 

        Je prends tout tes conseils et je vais continuer de me creuser la tête. 

        Merci ! 

        • Partager sur Facebook
        • Partager sur Twitter
          24 novembre 2020 à 10:11:10

          Bonjour,

          Il y des indéterminées dans ce ton code, je pense que c'est la cause de ton problème:
          - ligne 10 : tu testes suiteOrdreCroissant mais tu n'as jamais décidé de sa valeur initiale.
          - ligne 14 : tu testes tableau[i+1] mais attention quand i atteint la dernière case du tableau,  tableau[i+1] n'est pas défini. Il faut que la boucle for s'arrête un indice plus tôt.
          - ligne 19 : c'est une idée, mais l'enlever et enlever en même temps les lignes 22 à 25 devrait permettre à la fonction d'être plus rapide.

          • Partager sur Facebook
          • Partager sur Twitter

          En recherche d'emploi.

            24 novembre 2020 à 17:00:34

            J'ai pris le temps de testé ton code.
            Premièrement, puisque tu compares tableau[i] avec tableau[i+1] il faut vérifier que tailleTableau soit < tailleTableau-1.
            J'ai volontairement mis au début de mes tests tableau[tailleTableau] = 0  Cette position est en dehors du tableau, je le signale.
            Mon tableau commençait par 0 alors que j'avais mis des valeurs de 1 à 10 en ordre inverse sur un tableau de longueur 10.
            J'ai également compté le nombre de comparaisons. C'est un tri particulièrement inefficace.
            Je ne sais pas où tu as cherché pour trouver ce tri.
            Un tri à bulles m'aurais pris 45 ( N*(N-1)/2 ) comparaisons. Ce tri m'en a pris 174.
            Je te suggère de regarder du côté des tris par sélection, insertion, bulles.
            Ce ne sont pas des tris efficaces, mais ils sont faciles à coder.
            • Partager sur Facebook
            • Partager sur Twitter

            Le Tout est souvent plus grand que la somme de ses parties.

              24 novembre 2020 à 20:46:26

              Merci beaucoup pour les retours!! 

              Déjà en initialisant ma variable suiteOrdreCroissant à 1, le code fonctionne, peu importe le nombre de valeur dans mon tableau. Et je suis déjà très contente vu le temps passé ^^ 

              Je vais tester tout vos conseils pour essayer de trouver une solution plus rapide, et optimiser le nombre de comparaison, je commence tout juste a comprendre la logique.

              Je vous remercie vraiment pour vos réponses!

              • Partager sur Facebook
              • Partager sur Twitter

              Exercice 5 - Trier valeurs tableau

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown