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 :

tri


Sujet :

Algorithmes et structures de données

  1. #1
    Inactif  
    Inscrit en
    Mars 2006
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 352
    Points : 292
    Points
    292
    Par défaut tri
    Bonjour,comment trier un tableau avec une seule boucle,merci

  2. #2
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    Ce code fait une seule boucle mais cela est aboslument CONTRE PERFORMANT par rapport à des méthodes de type quick sort !!!
    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
     
    procedure triller( start_point, end_point : integer; var T );
    var i : integer;
       begin
       i:=start_point-1;
           repeat
           inc(i);
           if i < Start_point then i:=Start_Point;
           if T[i] > T[i+1] then
              begin
              echanger T[i] et T[i+1]
              dec(i,2);
              end;
           until i=end_point-1
       end;

  3. #3
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    Hum aller voir la FAQ...
    Première grosse démo en construction :
    http://bitbucket.org/rafy/exo2/

  4. #4
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Tu peut même faire mieux: un tri sans aucune boucle, entièrement récursif! (ben oui: comment vous croyez qu'on fait avec des langages fonctionnels?)

    Le tri quicksort, c'est bien. Le tri fusion (merge sort), c'est mieux! Le tri radix, c'est encore mieux! (mais pas applicable à tous les types de données)

    Sinon, j.p.mignot le tri dont tu parles, ça ne serait pas le "gnome-sort" par hasard?
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  5. #5
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    Je ne sais pas si cela porte un nom!
    J'ai écrit et utilisé une fois la méthode présentée pour éviter tout risque de montée incontrôlée dans la stack ce qui est un risque potentiel avec toutes méthodes récurcives.
    Mais il existe bien des techniques
    http://fr.wikipedia.org/wiki/Tri

  6. #6
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par j.p.mignot
    Je ne sais pas si cela porte un nom!
    J'ai écrit et utilisé une fois la méthode présentée pour éviter tout risque de montée incontrôlée dans la stack ce qui est un risque potentiel avec toutes méthodes récurcives.
    Mais il existe bien des techniques
    http://fr.wikipedia.org/wiki/Tri
    http://www.cs.vu.nl/~dick/gnomesort.html
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  7. #7
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par j.p.mignot
    pour éviter tout risque de montée incontrôlée dans la stack ce qui est un risque potentiel avec toutes méthodes récurcives.
    C'est vrai qu'il y a plein de critères à prendre en compte dans un algorithme de tri:

    - la vitesse
    - la quantité de mémoire utilisée (sur place ou pas)
    - la stabilité du tri (facteur souvent négligé)

    - d'autres, suivant le projet :
    ex: la manière dont le tri accède aux éléments (si il faut, par exemple, charger les éléments lorsqu'ils ne sont pas présents en mémoire, il vaut mieux que le tri porte sur des éléments consécutifs. Ce n'est pas le cas du tri par tas)

    Le tri fusion est très approprié (rapide, stable, pas d'aller-retour dans la liste) si ce n'est qu'il utilise plus de mémoire.


    Pour ce qui est de la récursivité, dans les langages fonctionnels, on ne peut pas faire autrement. Si je parlais de récursivité, c'est que sidahmed sous-entendait que le minimum de boucle pour trier un tableau était 1; or c'est faux: avec la récursivité on a 0 boucle. C'était une sorte de boutade !
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  8. #8
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Le "gnome sort" a des propriétés interessantes:
    - il est "sur place" et utilise très peu de mémoire
    - il est stable (enfin il me semble)
    - son code est de très petite taille. Une fois compilé, ça devrait être pareil

    Il peut donc être très intéressant dans les cas où on peu de mémoire à disposition (le genre système embarqué)

    Par contre, il a un inconvénient:
    - il est très lent
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  9. #9
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Un quicksort optimisé ne prend pas tant de place que ça une fois compilé (d'autant qu'il faut pas abuser : même sur de l'embarqué, 30 octets de différence c'est pas si gros...), il est beaucoup plus rapide que le gnome-sort et est aussi sur place. (par contre c'est vrai qu'il prend une place en O(log(n)) lors de l'exécution alors que le gnomesort est en O(1)...et il n'est pas stable en général)

    --
    Jedaï

  10. #10
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Je confirme, quicksort n'est pas stable (ça peut être gênant dans certains cas). Si on veut être pointilleux, on peut dire aussi que les performances de quicksort dépendent du choix du pivot, mais il faut vraiment prendre des cas défavorables complètement fabriqués pour l'occasion.

    Dans la plupart des langages, c'est l'algorithme merge sort qui est utilisé pour les fonctions de tri, d'abord pour des raisons de stabilité et ensuite parce qu'il est performant (dans la majorité des cas, le problème de la mémoire est secondaire: pour trier des petits tableaux, ça passe)

    Après, il peut être intéressant de se demander quel algorithme est utilisé pour trier des gros fichiers (accès séquentiel aux éléments, pas la possibilité de mettre tout le contenu du fichier en mémoire, utilisation de cache...) mais à mon avis, c'est un dérivé de merge sort, basé sur de manipulations de fichiers temporaires, qui est utilisé.
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  11. #11
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    Je viens d'apprendre que j'ai "réinventé" un algorithme ( de 3 lignes!) existant!
    Blague à part les seuls avantages que je lui ai vu étaient
    - code très petit ( important dans certains processeurs embarqués)
    - garantie de ne pas aller dans la stack trop loin (encore plus important pour des petits systèmes embarqués disposant de très peu de mémoire )

    J'avais cité cet exemple uniquement car l'initiateur de cette discussion souhaitait un algorithme en une boucle.

    Personnellement dans la plus part des cas, sur PC, j'utilise QuickSort

  12. #12
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    si tu connais le plus grand élément et le plus petit, tu peus trier ton tableau sans faire de comparaisons. c'est le tri le plus rapide.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  13. #13
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    ???
    si j'ai 4 chiffres, par exemple a=2 b=1 c=4 d=3, que je connaisse min et max et que je veuille ordonner (a,b,c,d) dans l'ordre croissant par exemple, SANS faire de comparaison comme vous l'annoncez, je serais bien curieux que vous m’indiquiez un code pour cela

  14. #14
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    pas de soucis, voilà comment procéder sans comparaison :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     - Déclarer un tableau T de quatre éléments et l'initialiser à 0
     
     - parcourir tous les élément "e" et incrémenter T en faisant T[e]++ ;
     
     - Dans l'exemple que tu as donné, on obtient alors comme contenu de T :
        1 1 1 1
     
     - Il suffit alors de restituer les éléments qui sont dans T
        - Pour i qui va de 1 à Taille de T
              tant que T[i] est non nul
                     Afficher i
                     T[i]--

    Si on prend un autre exemple : 3 2 1 2, T sera rempli de la sorte :
    T = 1 2 1
    Donc on le vide en mettant :
    1 2 2 3


    C'est le tri le plus rapide qu'il existe, il est en O(N), plus exactement en O(2N), mais on se fout des coéfficients dans la complexité.
    Le quicksort est en MOYENNE, le tri par COMPARAISON le plus rapide.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  15. #15
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    Il y a une comparaison à 0 ( ou eventuellement valeur min suivant la construction de T )??

  16. #16
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par ToTo13
    Bonjour,

    pas de soucis, voilà comment procéder sans comparaison :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     - Déclarer un tableau T de quatre éléments et l'initialiser à 0
     
     - parcourir tous les élément "e" et incrémenter T en faisant T[e]++ ;
     
     - Dans l'exemple que tu as donné, on obtient alors comme contenu de T :
        1 1 1 1
     
     - Il suffit alors de restituer les éléments qui sont dans T
        - Pour i qui va de 1 à Taille de T
              tant que T[i] est non nul
                     Afficher i
                     T[i]--

    Si on prend un autre exemple : 3 2 1 2, T sera rempli de la sorte :
    T = 1 2 1
    Donc on le vide en mettant :
    1 2 2 3


    C'est le tri le plus rapide qu'il existe, il est en O(N), plus exactement en O(2N), mais on se fout des coéfficients dans la complexité.
    Le quicksort est en MOYENNE, le tri par COMPARAISON le plus rapide.
    Tu supposes également que ton espace de valeur est suffisemment densément peuplé d'une part et que tu peux allouer suffisemment de mémoire en plus d'autre part.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  17. #17
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Peux tu détailler, j'ai pas tout compris !!!
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  18. #18
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par ToTo13
    C'est le tri le plus rapide qu'il existe, il est en O(N), plus exactement en O(2N), mais on se fout des coéfficients dans la complexité.
    Le quicksort est en MOYENNE, le tri par COMPARAISON le plus rapide.
    Ce tri est rarement le plus rapide : il n'est le plus rapide que si tu as un espace de valeur possible suffisamment petit, sinon il est inutilisable (ou extrèmement lent). Par exemple si le min est -2*10^9 et le max 2*10^9 sur les entiers, ce tri sera extrèmement couteux...

    Le quicksort n'est pas en moyenne le tri par comparaison le plus rapide, il fait partie des tris en moyenne en O(n log n) (comme le tri fusion et le tri par tas par exemple), et O(n log n) est la limite absolue pour les tris par comparaison, on ne peut pas faire plus rapide... Le tri fusion est théoriquement plus rapide que le quicksort en moyenne et en plus conserve une complexité en O(n log n) dans le pire cas (alors que quicksort dégènère en O(n²)), mais même le tri fusion n'est pas aussi rapide que le meilleur tri par comparaison, c'est facile à vérifier en créant soi-même ce tri pour de petites valeurs de n : le tri fusion fait quelques comparaisons inutiles.

    --
    Jedaï

  19. #19
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    D'autre part si on veut classer des entités non entières, il y a un réel problème. D'où je pense la remarque de Jean-Marc.Bourguet. Avec des rationnels c'est envisageable à grands frais sur la taille de T mais avec des irrationnels cela devient problématique de définir le "zoom" nécessaire pour le classement.

  20. #20
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par ToTo13
    Peux tu détailler, j'ai pas tout compris !!!
    Tu as besoin d'un tableau supplémentaire. Ce peut être génant.

    Ton algo n'est pas seulement en O(N), il est aussi en O(max-min). Et si N log N < max-min il n'est pas "meilleur" (pour autant que la complexité assymtotique ait réellement un intérêt pratique pour les données en question, ce dont il faut toujours s'assurer avant de faire un choix d'algo sur cette base).

    Sur le même principe il y a aussi le radix-sort.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  2. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 20h25
  3. Tri par fusion d'un tableau
    Par Mailgifson dans le forum C
    Réponses: 5
    Dernier message: 12/12/2002, 14h53
  4. [VBA-E] [Excel] Tri automatique
    Par bovi dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/10/2002, 10h19
  5. [] Tri d'un tableau par ordre alphabétique
    Par cafeine dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 17/09/2002, 08h43

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