Partage
  • Partager sur Facebook
  • Partager sur Twitter

tableaux, ordre croissant décroissant

...

    26 juin 2007 à 14:15:13

    @ Cyprien_

    Quand j'enlève le 2eme "fini = 1;"
    il ne se passe ... rien :p
    par contre...

    J'avait fait un tableau de 8 case , et he faisais :

    ordonnerTableau(tableau, 5)
    // 8 cases et pas 5 !! lol


    Donc forcément :p
    enfin bon maintenant ça marche

    merci
    • Partager sur Facebook
    • Partager sur Twitter
      27 juin 2007 à 20:00:16

      Clement_93, Je suis ravie que tu est compris ce que j'ai expliquer car moi je suis aussi un debutant, (J'en suis a la deuxieme partie du programme en C au chapitre sur les lettre), ET c'est la premiere fois que je poste un message pour aider une personne.
      Ca me donne envie de continuer.
      • Partager sur Facebook
      • Partager sur Twitter
        27 juin 2007 à 20:50:22

        Pour ceux qui auraient un peu de mal, voici la fonction que j'ai écrite pour ordonner les chiffres d'un tableau... ou plutôt deux. Pour éviter de m'embrouiller et de faire un code trop barbare, j'ai préféré séparer le tout en deux fonctions: Une qui se chargera du tri et une deuxième qui se chargera de dire si la liste est en ordre ou non. Voici la première fonction, celle qui s'occupe du tri :

        void ordonnerTableau(long tableau[], long tailleTableau)
        {
             long i, echange;
             do
             {
             for (i = 1 ; i < tailleTableau  ; i++)
             if  (tableau[i-1] >= tableau[i])
             {
                 echange = tableau[i-1];
                 tableau[i-1] = tableau[i];
                 tableau[i] = echange;
             }
             } while (ordre(tableau, tailleTableau) == 0);
        }


        Je détaille un peu le fonctionnement. On va prendre comme exemple un tableau de taille 4. On envoie donc notre tableau à la fonction qui va comparer les deux premières valeurs, c'est-à-dire tableau[0] et tableau[1]. Si tableau[0] est plus grand que tableau[1] alors on permute les deux valeurs, c'est-à-dire que tableau[0] devient tableau[1] et tableau[1] devient tableau[0]. La fonction procède de même avec les valeurs tableau[1] tableau[2] et tableau[2] tableau[3]. A la fin de ce premier tri, on a un nouveau tableau. C'est la que là deuxième fonction intervient...

        char ordre(long tableau[], long tailleTableau)
        {
             long i;
             for (i = 1 ; i < tailleTableau ; i++)
             {
             if (tableau[i-1] <= tableau[i])
             {
             }
             else
             return 0;
             }
             return 1;
        }


        Si le tableau est parfaitement rangé, la fonction renvoie la valeur 1 sinon elle renvoie la valeur 0. Si le tableau n'est pas rangé (valeur 0), on recommence le tri jusqu'à que le tableau soit rangé dans l'ordre croissant (Valeur 1).

        De manière plus générale, on peut résumer la fonction ainsi:

        Faire :
        - Comparer la valeur i-ème et i-1-ème du tableau.
        - Si la valeur i-1-ème est plus grande que la valeur i-ème du tableau alors on permute les deux valeurs.
        - On répète l'opération pour les valeurs i-ème et i+1-ème du tableau.
        - On regarde si le tableau obtenu est rangé. Si oui, on arrête la fonction. Si non, on recommence tout jusqu'à que le tableau soit bien rangé.
        • Partager sur Facebook
        • Partager sur Twitter
          28 juin 2007 à 12:08:41

          Erosquare: Ton code à l'air bien, mais je suis pas sûr que ça soit hyper clair de faire deux fonctions. Ca fait beaucoup de code pour peu de chose, faire une fonction là ou un booléen suffit. Tu fais deux fois plus de for(), donc le temps d'exécution est doublé.

          M'enfin pourquoi pas. Si ça intéresse quelqu'un, je suis en train (comme j'ai rien à faire) d'implémenter toutes les méthodes de tri en C.
          • Partager sur Facebook
          • Partager sur Twitter
          J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
          Anonyme
            28 juin 2007 à 15:35:16

            Personne n'a prêté attention à mon post?

            Je propose ce petit programme pour ordonner des entiers en ordre croissant.


            #include<stdlib.h>
            #include<stdio.h>

            int main(void)
            {
                int i, j, temp;
                int liste_valeurs[] = {5, 9, 65, 2, 11, 9, -1, 20, 8, 7};
                int nombre_valeurs = 10;   


                for(i=0; i < nombre_valeurs; i++)
                {
                    for(j=i+1; j < nombre_valeurs; j++)
                    {
                        if(liste_valeurs[i] < liste_valeurs[j])
                        {
                            temp = liste_valeurs[i];
                            liste_valeurs[i] = liste_valeurs[j];
                            liste_valeurs[j] = temp;
                        }
                    }
                }

                for(i=0; i < nombre_valeurs; i++)
                {
                    printf("%d ", liste_valeurs[i]);
                }


                getchar();

                return 0;
            }
             



            http://fr.wikipedia.org/wiki/Algorithme_de_tri
            http://www.siteduzero.com/tuto-2-217-algorithmique.html
            • Partager sur Facebook
            • Partager sur Twitter
              28 juin 2007 à 16:20:48

              Citation


              Je propose ce petit programme pour ordonner des entiers en ordre croissant.



              Il paraît bien. C'est le tri par sélection, c'est ça ? Par contre, nombre_de_valeurs2 ne sert pas dans ton programme. nombre_de_valeurs peut être utilisé à la place.

              Secret (cliquez pour afficher)

              Bon, puisqu'on a fait le tri par insertion, le tri par sélection, et le tri à bulles, je me la ramène avec mon QuickSort tiens ;) :

              //Peu teste

              #include <stdlib.h>

              //Trie tab[] depuis la case N°Debut a la case N°fin. Typiquement
              //on appelle QuickSort(tab, 0, taille-1);
              void QuickSort(int tab[], size_t debut, size_t fin)
              {
                  //Si la taille de la zone a trier = 1, rien a trier ;
                  if(fin-debut < 2)
                      return ;

                  //On prend l'index du millieu du tableau (pivot). gauche & droite serviront
                  //pour parcourir avec des boucles
                  size_t pivot = (fin-debut)/2 + debut;
                  size_t gauche = debut;
                  size_t droite = fin;

                  //Pour echanger 2 valeurs
                  int temp;
                 
                  //Je ferais un break; au moment ou on devra sortir...
                  while(1)
                  {
                      //Je pars de la gauche, je parcours le tableau vers la droite a la
                      //recherche d'une valeur superieure au pivot. Apres, je pars de la droite,
                      //Je recherche une valeur inferieure au pivot.
                      for(gauche = debut; tab[gauche] < tab[pivot]; gauche++) {}
                      for(droite = fin; tab[droite] > tab[pivot]; droite--) {}

                      //Si on a trouve une valeur plus grande avant le pivot et une plus
                      //petite apres, alors on permute...
                      if(gauche < pivot && droite > pivot)
                      {
                          temp = tab[gauche];
                          tab[gauche] = tab[droite];
                          tab[droite] = temp;
                      }
                      //Sinon on stoppe la boucle.
                      else
                      {
                          break;
                      }
                  }

                  //Et, apres, on recommence avec les 2 parties du tableau a gauche et a droite du pivot.
                  QuickSort(tab, debut, pivot-1);
                  QuickSort(tab, pivot+1, fin);
              }

               

              Pour ceux qui auraient pas compris, le pivot c'est le milleu du tableau. On fait passer toutes les valeurs inférieures au pivot à sa gauche et toutes els autres à sa droite, puis on recommence avec la partie gauche et droite du tableau.
              • Partager sur Facebook
              • Partager sur Twitter
              J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
              Anonyme
                28 juin 2007 à 16:52:36

                Citation : GuilOooo


                Il paraît bien. C'est le tri par sélection, c'est ça ? Par contre, nombre_de_valeurs2 ne sert pas dans ton programme. nombre_de_valeurs peut être utilisé à la place.



                C'est sans doute le tri par sélection, en fait je l'ai directement pris du code source que j'avais écris pour résoudre ce problème, et nombre_de_valeurs2 avait son utilité, c'est pour ça qu'elle est présente et j'ai oublié de l'enlever.
                • Partager sur Facebook
                • Partager sur Twitter
                  28 juin 2007 à 17:13:25

                  Tu peux aussi, pour éviter les permutations inutiles, retenir dans un int temporaire l'index de la plus petite valeur trouvée jusque là (dans le for interne), puis permuter la case à cet index avec la i-ème. Ca évite de permuter pour rien, mais ça fait un int en plus.

                  Sinon, tu veux que je te dise quoi à propos de ce code ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                  J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.

                  tableaux, ordre croissant décroissant

                  × 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