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 :

[Débutant] Tri par insertion


Sujet :

Algorithmes et structures de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 19
    Points : 14
    Points
    14
    Par défaut [Débutant] Tri par insertion
    Bonjour,

    Je débute l'algorithmie avec le livre "Introduction to algorithms de T.H. Cormen" 3ème édition.

    En patientant de m'acheter le livre en Français, je débute donc sur cette référence en Anglais.

    Par contre je n'ai que très peu base en algorithmie et du coup je suis un peu perdu avec la syntaxe.

    Dans le premier algo : chapitre 2.1 Insertion sort :

    On parle bien de tri par insertion ? C'est à dire comme dans l'exemple des cartes où je tire une carte d'une pile posée sur une table puis la place dans ma main vide la première fois. Ensuite je tire une 2ème carte de la pile que je compare avec mon autre carte. Si cette 2ème carte est plus petite que ma 1ère alors je la place à gauche de celle-ci, sinon elle reste à droite. Ensuite je tire une 3ème carte que je compare avec mes 2 autres et je la place de manière à avoir un tri ascendant. Et ainsi de suite... Donc au final selon le nombre de cartes de la pile que j'ai tiré et qui est maintenant dans ma main, j'ai une suite ascendante de carte.

    On est bien dans un tri par insertion. Et c'est là où j'ai besoin d'une première aide pour la suite, car dans le cours ils parlent d'un tableau qui a un nombre d'élément : A[1 .. n] -> The algorithm sorts the input numbers in place: it rearranges the numbers within the array A, with at most a constant number of them stored outside the array at any time.

    D'une part celà veut dire que le tableau à déjà un nombre d'élément à l'intérieur comme dans la suite : A = (5, 2, 4, 6, 1, 3) Donc on n'est pas dans un tri par insertion là ? On est dans un tri d'élément connu, ou alors il faut imaginer qu'on aura un programme qui donne un nombre d'éléments au tableau, pour que celui-ci soit trié après ? Mais si c'est le cas ce n'est pas trié comme dans l'exemple des cartes.
    D'autre part je ne comprend pas cette phrase : " it rearranges the numbers within the array A, with at most a constant number of them stored outside the array at any time." Je la traduit comme : "l'algorithme trie les numéros entrée sur place, il réarrange les numéros à l'intérieur du tableau A, avec au plus un nombre constant de ces numéros en dehors du tableau à n'importe quel moment." C'est surtout la fin de la phrase qui me chagrinne, je ne comprend vraiment pas "avec au plus un nombre constant de ces numéros en dehors du tableau à n'importe quel moment".

    Donc pour l'exercice :
    1 2 3 4 5 6
    (a) 5 2 4 6 1 3
    // flèche grise: 5 vers 2, flèche noire : 2 vers 5

    (b) 2 5 4 6 1 3
    // flèche grise: 5 vers 4, flèche noire : 4 vers 5

    (c) 2 4 5 6 1 3
    // flèche noire : 6 vers 5

    (d) 2 4 5 6 1 3
    // flèches grise: 2 vers 4, 4 vers 5, 5 vers 6, 6 vers 1, flèche noire : 1 vers 2

    (e) 1 2 4 5 6 3
    // flèches grise: 4 vers 5, 5 vers 6, 6 vers 3, flèche noire : 3 vers 4

    (f) 1 2 3 4 5 6

    The operation of INSERTION-SORT on the array A = (5, 2, 4, 6, 1, 3). Array indices
    appear above the rectangles, and values stored in the array positions appear within the rectangles.
    (a)–(e) The iterations of the for loop of lines 1–8. In each iteration, the black rectangle (caractère gras)holds the
    key taken from A[j], which is compared with the values in shaded rectangles (souligné) to its left in the test of
    line 5. Shaded arrows show array values moved one position to the right in line 6, and black arrows
    indicate where the key moves to in line 8. (f) The final sorted array.

    Ensuite on à l'algorithme :
    INSERTION-SORT. A
    1 for j = 2 to A.length
    2     key = A[j]
    3     // Insert A[j] into the sorted sequence A[i .. j -1]
    4     i = j  - 1
    5     while i>0 and  A[i] > key
    6         A[i + 1] =  A[i]
    7         i = i - 1
    8  A[i + 1] = key
    Figure 2.2 shows how this algorithm works for A = (5, 2, 4, 6, 1, 3). The index
    j indicates the “current card” being inserted into the hand. At the beginning
    of each iteration of the for loop, which is indexed by j , the subarray consisting
    of elements A[1 .. j - 1] constitutes the currently sorted hand, and the remaining
    subarray A[j + 1 .. n] corresponds to the pile of cards still on the table. In fact,
    elements A[1 .. j - 1] are the elements originally in positions 1 through j - 1, but
    now in sorted order.

    Voici comment je comprends l'algo :
    1. on démarre une boucle for avec un indice j = 2 compris dans un tableau A de 6 éléments
    2. une variable key vaut A[2]
    3. commentaire insertion A[2] dans le tri de séquence A[1 .. j - 1]
    4. une variable i vaut 2 - 1 // donc 1
    5. boucle while : tant que 1 > 0 et que A[1] > A[2] // true false donc on n'entre pas dans while
    6. alors A[1 + 1] = A[1] // ici ma compréhension : A[1]
    7. 1 = 1 -1 // donc 0 ?


    8 on retourne ? à la sortie de while A[1 + 1] = A[2] // donc A[2]

    Bref j'essaie de comprendre mais c'est très tordu.
    Qui aurait la patiente de m'expliquer (Bien sur en regardant sur le livre parce que j'ai copié comme j'ai pu l'exemple)

    Et si possible de remplacer cet algo en php avec lequel je suis habitué.

    Merci !!

  2. #2
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Donc on n'est pas dans un tri par insertion là ?
    En fait si. Si tu considère seulement la partie trié du tableau. A savoir les n casse déjà trié. En reprenant ton exemple
    Non trié : 5 2 4 6 1 3
    Trié : []
    En mémoire : [5, 2, 4, 6, 1, 3]
    Index trie : 0


    Non trié : 2 4 6 1 3
    Trié : [5]
    En mémoire : [5, 2, 4, 6, 1, 3]
    Index trie : 1

    Non trié : 4 6 1 3
    Trié : [2, 5]
    En mémoire : [2, 5, 4, 6, 1, 3]
    Index trie : 2

    Non trié : 6 1 3
    Trié : [2, 4 ,5]
    En mémoire : [2, 4, 5, 6, 1, 3]
    Index trie : 3

    Non trié : 1 3
    Trié : [2, 4 ,5, 6]
    En mémoire : [2, 4 5, 6, 1, 3]
    Index trie : 4

    Non trié : 3
    Trié : [1, 2, 4 ,5, 6]
    En mémoire : [1, 2, 4, 5, 6, 3]
    Index trie : 5

    Non trié :
    Trié : [1, 2, 3, 4 ,5, 6]
    En mémoire : [1, 2, 3, 4, 5, 6]
    Index trie : 6

    Ce qui se passe c'est qu'à chaque itération, tu insert un nouvel élément dans la liste trié. Dans une problématique de gain d'espace mémoire, au lieu de déclare un second tableau, on utilise le début du tableau des éléments non trié.
    La visualisation fournit par wikipédia est d'ailleurs très parlant :


    Pour la compréhension du pseudo code de l'algorithme en question, je pense que le plus simple est de voir la version traduite sur wikipédia, avec les explications et tout ce qui va bien :
    http://fr.wikipedia.org/wiki/Tri_par_insertion

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  3. #3
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour,

    le tableau n'étant pas la bonne structure pour faire un tri par insertion (puisqu'il faut tout le temps bousculer les voisins), il filoute en faisant de la place (mettant temporairement quelques nombres dehors), puis fait son insertion.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 19
    Points : 14
    Points
    14
    Par défaut
    Merci pour votre aide

    J'ai bien travaillé sur cet algorithme et j'ai fini par comprendre :

    1 for j = 2 to A.length
    2     key = A[j]
    3     // Insert A[j] into the sorted sequence A[i .. j -1]
    4     i = j  - 1
    5     while i>0 and  A[i] > key
    6         A[i + 1] =  A[i]
    7         i = i - 1
    8  A[i + 1] = key
    1 On démarre une boucle for avec l'indice j = 2 // donc on démarre la boucle à partir du 2ème élément du tableau A
    2 on stocke dans une variable key la valeur de l'élément 2 du tableau
    4 un indice i = j - 1 // i nous servira à comparer la valeur de l'élément à gauche de A[j] avec la valeur de A[j]
    5 une boucle qui vérifie si la valeur A[i], donc ici l'élément 1 de A, est > que la valeur de l'élément 2 (key)
    6 si c'est vrai alors l'élément A[i] est déplacé dans l'élément A[i + 1]
    7 on retire 1 à i // si c'était la première boucle la condition devient fausse, on passe à ligne 8
    8 le deuxième élément du tableau (pour la première itération) prend la place du 1er élément

    et on repart avec j = 3 jusqu'à la fin du tableau.

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

Discussions similaires

  1. besoin d'aide pour le tri par insertion.
    Par argon dans le forum Algorithmes et structures de données
    Réponses: 19
    Dernier message: 18/05/2006, 11h15
  2. tri par insertion et Structures
    Par bonjour69 dans le forum C
    Réponses: 2
    Dernier message: 23/12/2005, 12h46
  3. [LG] Le tri par insertion d'un enregistrement
    Par phoebee dans le forum Langage
    Réponses: 4
    Dernier message: 01/09/2005, 20h38
  4. [LG]Tri par insertion dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 4
    Dernier message: 18/12/2003, 22h34

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