IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Trier un tableau par ordre croissant


Sujet :

Algorithmes et structures de données

  1. #1
    Rédacteur
    Avatar de Halleck
    Homme Profil pro
    Consultant PHP
    Inscrit en
    Mars 2003
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Consultant PHP

    Informations forums :
    Inscription : Mars 2003
    Messages : 597
    Points : 878
    Points
    878
    Par défaut Trier un tableau par ordre croissant
    Bonjour à tous,

    je n'arrive pas à trouver comment trier un tableau. J'ai fais pour l'instant ça en PHP:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    // le tableau avec les valeurs à trier 
    $tab[0] = 8; 
    $tab[1] = 5; 
    $tab[2] = 4; 
    $tab[3] = 9; 
     
    $nbvaleurs = 4-1; // le premier indice est 0, pas 1. je ne met pas 3 tout de suite pour me repérer plus facilement ;o) 
     
    ///////////////////// 
    // TRI CROISSANT // 
    ///////////////////// 
    for ($i = 0; $i < $nbvaleurs; $i++) 
    { 
       $flag = $nbvaleurs; 
       for($j = 0; $j <$nbvaleurs; $j++) 
       { 
             // trouver le comparé 
          $Compare = $tab[$j]; 
             // trouver le comparant 
          $flag = $flag - 1; 
          $NbComparant = $nbvaleurs - $flag; 
          $Comparant = $tab[$NbComparant]; 
             // sauvegarder le comparant 
          $SavComparant = $tab[$NbComparant]; 
     
             // COMPARER 
          if($Compare>$Comparant) 
          { 
                // inverser le comparant et le comparé 
             $tab[$NbComparant] = $tab[$i]; 
             $tab[$i] = $SavComparant; 
          } 
       } 
    } 
    ////////////////////
    Ca trie bien comme il le faut, mais seulement quand il y a moins de 5 valeurs à trier . Est-ce que vous avez une idée pour arranger tout ça?

    Merci d'avance

    PS: j'ai posté également dans le forum Autres langages et outils. On m'a conseillé de poster ici, donc j'ai mis l'autre sujet en délestage... (Pas taper! pas Multipost! Nooon! Aïe! maiheuuuuuu! )

  2. #2
    Membre éclairé Avatar de nako
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2003
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2003
    Messages : 577
    Points : 663
    Points
    663
    Par défaut
    salut,
    il existe une (plusieurs même) fonction(s) pour trier un tableau en PHP :
    http://www.php.net/manual/fr/function.sort.php entres autres.
    Maintenant, si tu veux programmer tout de même le tri toi-même, fais une recherche sur google sur quicksort ou tri à bulle, ou sur méthodes de tris ... la littérature (comme on dit) est abondante sur le sujet.
    a+

  3. #3
    Rédacteur
    Avatar de Halleck
    Homme Profil pro
    Consultant PHP
    Inscrit en
    Mars 2003
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Consultant PHP

    Informations forums :
    Inscription : Mars 2003
    Messages : 597
    Points : 878
    Points
    878
    Par défaut
    Super! Merci beaucoup! Vraiement, depuis le temps que je cherche, je n'ai jamais trouvé cette fonction (Une recherche avec google sur "tri tableau php" donne pas grand chose .

    Mais ce ci dit, c'est vrai que ca m'interesserait de savoir comment on fait. Si vous pouviez juste m'indiquer pourquoi j'ai faux dans mon code... Merci d'avance

  4. #4
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Je n'ai pas vérifié, mais en écrivant
    $nbvaleurs = 4-1 et $i < $nbvaleurs, il me semble que tu n'atteindras jamais $tab[3], qui ne sera jamais comparé.

  5. #5
    Rédacteur
    Avatar de Halleck
    Homme Profil pro
    Consultant PHP
    Inscrit en
    Mars 2003
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Consultant PHP

    Informations forums :
    Inscription : Mars 2003
    Messages : 597
    Points : 878
    Points
    878
    Par défaut
    Ben... je crois que si, vu que pour le tableau que j'ai mis en exemple ici, le tri s'effectue bien. . Ou bien c'est une coïncidence? j'avoue être un littéarire dans l'âme, donc pas très fort en math, il se peut donc que je me trompe

  6. #6
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 129
    Points
    28 129
    Par défaut
    Le tri s'effectue bien car la dernière case contient la plus haute valeure...
    Essaie en remplacant '9' par '1', et dis nous le résultat stp

  7. #7
    Rédacteur
    Avatar de Halleck
    Homme Profil pro
    Consultant PHP
    Inscrit en
    Mars 2003
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Consultant PHP

    Informations forums :
    Inscription : Mars 2003
    Messages : 597
    Points : 878
    Points
    878
    Par défaut
    J'ai mis "1" à la place de "9", le tri s'effectue bien:
    1458
    Ca ne vient pas de ça donc ...

  8. #8
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 814
    Points : 7 642
    Points
    7 642
    Par défaut
    Salut,

    En regardant rapidement, ton code marche bien pour 4 valeurs car il regarde les valeurs de rang 0 à 2, et les compare avec toutes les valeurs de rang supérieur jusqu'au rang 3.

    Donc normalement ça devrait marcher avec un tableau ayant plus d'éléments, en prenant soin de remplacer le 4 dans ta ligne

    par la valeur qui convient (=nombre d'éléments dans ton tableau)

  9. #9
    Membre éclairé Avatar de nako
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2003
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2003
    Messages : 577
    Points : 663
    Points
    663
    Par défaut
    note bien que plutôt que de faire ta soustraction, tu as une fonction en PHP qui te compte le nombre d'éléments d'un tableau : count

    donc ton code devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $nbvaleurs = count($tab);
    C'est bien de vouloir tout faire pour comprendre, mais il ne faut pas oublier que les langages récents contiennent nativement un certain nombres de fonctions. (mais j'ai bien compris que dans ton cas, tu souhaite apprendre)
    a+

  10. #10
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 129
    Points
    28 129
    Par défaut
    Dans la mesure ou je parle pas PHP, voici comment je coderai un tri :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
     
     
    //remplissage du tableau
    int i=0, j=0, taille=0;
    taille = ... // nombre_d'elements_du_tableau
     
    Tanque (j < taille-1) faire    // Pour chaque élément
       Pour (i = 0 à taille-2)    // taille-2 car je compare tab[i] à tab[i+1]
          Si ( tab[i] > tab[i+1] )    // Si on n'a pas le bon ordre
             int tempo = tab[i] ;     // on stocke la valeur de tab[i]
             tab[i] = tab[i+1] ;       // On change
             tab[i+1] = tempo ;      // on restitue la valeur sauvée
          FinSi ;
       FinPour ;
       j = j+1 ; // ne pas oublier d'incrémenter j
    FinTantque
    Ca fait longtemps que j'ai pas codé un tri, donc il est possible (et même probable) que cet algo ne soit pas fonctionnel. Cependant, j'espère qu'il t'aidera à mieux cibler ton erreur (on sait jamais).

  11. #11
    Rédacteur
    Avatar de Halleck
    Homme Profil pro
    Consultant PHP
    Inscrit en
    Mars 2003
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Consultant PHP

    Informations forums :
    Inscription : Mars 2003
    Messages : 597
    Points : 878
    Points
    878
    Par défaut
    gangsoleil -> Je ne vois pas de différence avec mon code, sauf le Int. Pour moi Int permet de donner l'arrondi d'un nombre, je suppose qu'ici ce n'est pas le cas; à quoi sert-il alors? Juste à indiquer qu'on a une égalité?

    note bien que plutôt que de faire ta soustraction, tu as une fonction en PHP qui te compte le nombre d'éléments d'un tableau : count
    Ah ben oui, j'avais oublié. Merci

    C'est bien de vouloir tout faire pour comprendre, mais il ne faut pas oublier que les langages récents contiennent nativement un certain nombres de fonctions. (mais j'ai bien compris que dans ton cas, tu souhaite apprendre)
    Non seulement je veux apprendre, mais surtout je programme aussi en QBasic, et je ne crois pas qu'il y ait des fonctions de tri dans ce langage

    Donc normalement ça devrait marcher avec un tableau ayant plus d'éléments, en prenant soin de remplacer le 4 dans ta ligne
    Ben non justement. Le tri donne n'importe quoi quand le tableau est trop grand

    En tous cas, merci à tous de m'aider

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Citation Envoyé par Halleck
    gangsoleil -> Je ne vois pas de différence avec mon code, sauf le Int. Pour moi Int permet de donner l'arrondi d'un nombre, je suppose qu'ici ce n'est pas le cas; à quoi sert-il alors? Juste à indiquer qu'on a une égalité?
    non, ici le int déclare une variable de type entier, qui sert à sauver tab[i] pour échanger la valeur avec tab[j].

    Ceci étant dit, ton problème vient des indices de boucles :

    Si max est le nombre d'éléments dans le tableau, donc indices de 0 à max -1, tu devrais avoir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    pour i = 0 à max - 2  faire
        pour j = i + 1 à max - 1 faire
            si tab[i] > tab[j] faire
                tampon = tab[i]
                tab[i] = tab[j]
                tab[j] = tampon
            fin si
        fin pour j
    fin pour i
    avec :
    - boucle i de 0 à max - 2 pour respecter les indices, et i n'ayant pas besoin d'aller lire la dernière valeur, on laisse ce soin à la boucle j
    - boucle j de i+1 à max - 1 : on n'a pas besoin de se préoccuper des indices <= i dans cette boucle, et elle va jusqu'à la dernière valeur.

    et ton code marche avec 4 valeurs, car avec tes calculs d'indices etc..., tu balayes de fait tout le tableau, mais ce n'est plus le cas avec plus de valeurs.

  13. #13
    Membre habitué Avatar de PINGOUIN_GEANT
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 149
    Points : 155
    Points
    155
    Par défaut
    je pense que tu fais un "faux" tri à bulles, ta première boucle devrait aller dans le sens inverse.
    Autrement pour d'autres fonctions de tri, tu peux faire une recherche sur:
    tri par insertion, tri à bulles, tri rapide, tri fusion...

    edit: désolé, j'ai mal regardé => à chaque itération sur le premier indice d'un tri à bulles, un élément à la fin est bien placé donc tu peux arrêter à i.
    d'ailleurs je ne connais pas le php mais c'est bizarre que ton indice i intervient dans des if.

  14. #14
    Rédacteur
    Avatar de Halleck
    Homme Profil pro
    Consultant PHP
    Inscrit en
    Mars 2003
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Consultant PHP

    Informations forums :
    Inscription : Mars 2003
    Messages : 597
    Points : 878
    Points
    878
    Par défaut
    je vais essayer de modifier mes indices donc selon les conseils de thewho, mais par contre PINGUIN_GEANT, désolé, j'ai rien compris à tes histoires de "bulles", "tri par insertion", etc...

    Et pourquoi est-ce bizarre que mon indice i interviennent dans des if?

  15. #15
    Membre habitué Avatar de PINGOUIN_GEANT
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 149
    Points : 155
    Points
    155
    Par défaut Re: Trier un tableau par ordre croissant
    Citation Envoyé par Halleck
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
             // COMPARER 
          if($Compare>$Comparant) 
          { 
                // inverser le comparant et le comparé 
             $tab[$NbComparant] = $tab[$i]; 
             $tab[$i] = $SavComparant; 
          } 
       } 
    } 
    ////////////////////
    je ne comprends pas trop ces lignes, comme je ne connais pas le php.
    A quoi servent-elles ?
    quand tu regardes le code de gangsoleil (typiqument un tri à bulles), seul le deuxième indice intervient pour les comparaisons.

    quant à tri machin, tri bidule... ce sont juste des noms de tris, donc si tu veux des infos complémentaires sur d'autres possibilités tu sais ce qu'il te reste à faire.

  16. #16
    Rédacteur
    Avatar de Halleck
    Homme Profil pro
    Consultant PHP
    Inscrit en
    Mars 2003
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Consultant PHP

    Informations forums :
    Inscription : Mars 2003
    Messages : 597
    Points : 878
    Points
    878
    Par défaut Re: Trier un tableau par ordre croissant
    Citation Envoyé par PINGOUIN_GEANT
    Citation Envoyé par Halleck
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
             // COMPARER 
          if($Compare>$Comparant) 
          { 
                // inverser le comparant et le comparé 
             $tab[$NbComparant] = $tab[$i]; 
             $tab[$i] = $SavComparant; 
          } 
       } 
    } 
    ////////////////////
    je ne comprends pas trop ces lignes, comme je ne connais pas le php.
    A quoi servent-elles ?
    Le PHP n'intervient pas trop ici, juste pour les $ je pense... Dans ces lignes j'attribue la valeur du comparant au comparé si le permier est plus grand que le second. En gros j'inverse la position des valeurs comparées.

    Pour le "tri par insertion", etc..., j'ai trouvé ce que ca signifiait dans un exemple fourni par défaut avec QBasic 4.5, avec plein de tris différents. Je comprend la démo, mais les algorythmes en eux-mêmes non

    Je vais essayer de comprednre ces exemple, et en attendant je met. Si jamais je n'y arrive pas, je reposte ici.

    Merci à tous pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. trier un tableau par odre croissant
    Par bakman dans le forum VB.NET
    Réponses: 6
    Dernier message: 13/05/2011, 22h40
  2. Trier un vecteur par ordre croissant
    Par amin89 dans le forum Pascal
    Réponses: 5
    Dernier message: 17/11/2009, 21h22
  3. trier les couleur par ordre croissant de colorindex
    Par calvi2002 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 17/07/2009, 10h09
  4. Tri d'un tableau par ordre croissant
    Par goaks dans le forum Algorithmes et structures de données
    Réponses: 46
    Dernier message: 29/06/2007, 16h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo