[Débutant] Tri sur un tableau, totalement perdu ...

Tri sur un tableau, totalement perdu ... [Débutant] - Algo - Programmation

Marsh Posté le 01-02-2008 à 12:17:08    

Salut les phénos :hello:,
 
Je débute en algo, donc je me heurte à un problème qui a priori n'est pas très compliqué :D
 
Pour situer mon niveau, disons que j'ai vu les boucles Pour, TantQue, Répéter, et toutes les petites choses de ce niveau (par exemple quelques fonction comme sousChaine, etc), ainsi que les tableaux ...
 
J'ai donc l'exercice suivant :
"Ecrire l'algo de création d'un index de tri par ordre alphabétique des mots d'un tableau de 20 mots indicé de 0 à 19. L'index lui-même est un tableau, indicé de 1 à 20."
 
Disons que j'ai compris les tableaux ainsi que la notion d'index, mais j'ai du mal à travailler sur ces fichus index.
 
 
Voici le corrigé du prof :
 
Lexique :
i (entier, calculé) : indice d'itération utilisé pour remplir le tableau.
j (entier, calculé) : indice d'itération pour remplir l'index.
tabMots (tableau [0..19] de chaine, saisi) : tableau des mots.
tabIndex(tableau [1..20] de entier, saisi) : index
 
 
Algo :
 
Début
 
// Remplissage du tableau de mots
Pour i de 0 à 19
Faire   Saisir(tabMots[ i ])
FinPour
 
// Remplissage en vrac de l'index
Pour j de 1 à 20
Faire   tabIndex[j] = j-1
FinPour
 
// Tril à bulles
Pour i de 1 à 19
Faire   Pour j de i+1 à 20
         Faire   Si      tabMots[tabIndex[ i ]] > tabMots[tabIndex[j]]
                  Alors   permuter(tabIndex[ i ], tabIndex[j])
                  FinSi
         FinPour
FinPour
 
Fin
 
 
Donc, mes questions à propos du tri à bulle :D
 
La ligne "Pour i de 1 à 19", on est d'accord que c'est pour parser chaque MOT du tableau (Pas les index) ?
La ligne "Pour j de i+1 à 20", c'est pour parser chaque valeur de l'INDEX ?
 
 
 
Ne comprenant pas très très bien ce petit algo merdique (:o), j'ai voulu en faire un autre en utilisant un tri par insertion simple. J'en suis arrivé à (J'ai zappé la partie de remplissage du tableau et de l'index :
 
Début
 
Pour i de 2 à 20 // Je commence à partir de la 2nde valeur de mon index pour la comparaison
Faire      ind = i-1
            temp = tabIndex[ i ] // Je sauvegarde la valeur de mon index pour pas l'écraser plus tard
 
            // Là, je doute ... J'ai voulu dire : Tant que le mot courant est supérieur (alphabétiquement) au mot précédent, on continue, sinon on sort
            TantQue ind <= 20 et tabMot[tabIndex[ i ]] < tabMot[tabIndex[ind]]
            Faire    tabIndex[ i ] = tabIndex[ind] // J'écrase donc mon mot courant par le mot précédent
                       ind = ind - 1
            FinTantQue
 
            // Je mets à jour le mot précédent par le mot courant que j'avais sauvegardé ds ma variable avant qu'il ne soit écrasé par la précédente opération
            tabIndex[i-1] = temp
 
FinPour
Fin
 
Bref, c'est totalement foireux :/
 
Si une âme généreuse pouvait voler à mon secours :D

Message cité 1 fois
Message édité par Dr Dorian le 01-02-2008 à 13:05:50

---------------
Le topic de la cigarette électronique
Reply

Marsh Posté le 01-02-2008 à 12:17:08   

Reply

Marsh Posté le 01-02-2008 à 12:25:47    

Dr Dorian a écrit :


Faire   tabIndex[j] = j-1


Il y à certainement une faute ici,
je poursuis.

Reply

Marsh Posté le 01-02-2008 à 12:40:01    

Cette expression,  tabMots[tabIndex[ i ]], elle est à mourir de rire de la part d'un prof.
 
En plus c'est bien définit au dessus, i et j ne sont pas du même type.
 
je poursuis  :whistle:

Reply

Marsh Posté le 01-02-2008 à 12:41:16    

Heu c'est bien du même type, nan ? :??:
 
entier calculé ...


---------------
Le topic de la cigarette électronique
Reply

Marsh Posté le 01-02-2008 à 12:49:00    

Dr Dorian a écrit :

Heu c'est bien du même type, nan ? :??:
 
entier calculé ...


 
L'un va de 0 à 19 l'autre de 1 à 20.
Je viens d'Ada scool et c'est ainsi. De plus c'est pas très lisible ou je manque d'habitude pour ce genre de d'expression, on va dire ça  :sweat:  Ceci dis, je ne suis qu'un amateur  :jap:

Reply

Marsh Posté le 01-02-2008 à 13:03:24    

Code :
  1. Début
  2.    Pour i de 2 à 20 Faire
  3.       ind = i-1
  4.       temp = tabIndex[ i ]
  5.       TantQue ind <= 20 et
  6.          tabMot[tabIndex[ i ]] < tabMot[tabIndex[ind]] Faire
  7.             tabIndex[i] = tabIndex[ind]
  8.             ind = ind - 1
  9.       FinTantQue
  10.       tabIndex[i-1] = temp
  11.    FinPour
  12. Fin


 
A la ligne 6, si I va de 2 à 20 et que index reçoit  i-1 (à la ligne 3), et est décrémenté de 1 (à la ligne 9) il ne peur jamais être supérieur ni égale à 20,
alors le teste ind <= 20 est toujours vrai et inutile.
 
A la ligne 8, l'expression tabIndex[ind] [i] référence un tableau à deux dimension, nan ? Donc une erreur c'est glissée dans l'analyse.


Message édité par Profil supprimé le 01-02-2008 à 13:47:04
Reply

Marsh Posté le 01-02-2008 à 13:05:28    

Yep, c'est vrai que le test sur IND sert à rien, apparement :D
 
Concernant tabIndex, c'est une erreur à cause de l'italique :D
 
Il faut lire :
tabIndex = tabIndex[ind]


---------------
Le topic de la cigarette électronique
Reply

Marsh Posté le 01-02-2008 à 13:11:04    

Dr Dorian a écrit :


Concernant tabIndex, c'est une erreur à cause de l'italique :D
 
Il faut lire :
tabIndex = tabIndex[ind]


 
Yes au temps pour moi, c'est moi qui ai mal copier apparemment.

Reply

Marsh Posté le 01-02-2008 à 13:13:54    

Ca, c'est le trie ar insertion en Pascal, j'en ai besoin.
 

Code :
  1. Procedure TriInsertion(n : integer ; var t : tab);
  2. var i, j : integer;
  3. var z : real;
  4. begin
  5.    for i:=2 to n do begin
  6.        z := t[i]; (* z est la valeur à insérer *)
  7.                   (* dans l'endroit approprié du tableau *)
  8.  
  9.        (* On décale toutes les valeurs du tableau < z *)
  10.        (* à droite pour vider une place pour z        *)
  11.        j := i - 1;
  12.        while (j >= 1) and (t[j] > z) do begin
  13.            t[j + 1] := t[j];
  14.            j := j - 1;
  15.        end;
  16.        (* finalement la valeur z est insérée à son emplacement adéquat *)
  17.        t[j + 1] := z;
  18.    end;
  19. end;

Reply

Marsh Posté le 01-02-2008 à 13:33:51    

Yep
Je ne parviens toujours pas à lire l'algo du prof, et ne comprenant pas ce qu'est un index de tri, je ne suis pas plus avancé. Si tu m'explique un peux, peut-être que..., Tu peux cependant voir sur le code ci-dessus quelles sont les divergences avec ton propre code de tri par insertion qui n'est pas tout à fait, cependant ce que tu cherche à faire me semble t-il.


Message édité par Profil supprimé le 01-02-2008 à 13:48:09
Reply

Marsh Posté le 01-02-2008 à 13:33:51   

Reply

Marsh Posté le 01-02-2008 à 19:06:40    

Je pense que l'utilisation de l'index permet de gagner du temps lorsque tu dois trier un tableau de données importantes (tableau de grosses structures), il est plus rapide d'échanger des données de 4/8 bytes par exemple pour des nombres que des données de 1 ko (je dis n'importe quoi pour la taille mais c'est pour te donner une idée du problème).
Je n'ai pas décortiqué l'algo du prof mais il me parait correct, je n'ai pas compris par contre pourquoi l'un des tableaux par de 0 et l'autre de 1 ???
J'aurais dit aussi  
permuter_tabindex(i ,j)  
plutôt que
permuter(tabIndex[ i ], tabIndex[j])  

Reply

Marsh Posté le 04-02-2008 à 14:00:02    


=> Pour mieux comprendre l'algo tu peux te ramener a un bête tri de liste d'entiers par exemple.
 
Ca donne:
 

Code :
  1. // Remplissage du tableau d'entiers
  2. ...
  3. // Tri à bulles
  4. Pour i de 0 à nbEntier-1
  5. Faire   Pour j de i+1 à nbEntier-1
  6.          Faire   Si      tabEntier[ i ] > tabEntier[j]
  7.                   Alors   permuter(tabEntier[ i ], tabEntier[j])
  8.                   FinSi
  9.          FinPour
  10. FinPour
  11. Fin


 
Le truc de ton prof ça ajoute juste le fait qu'on trie les index et pas le tableau directement, mais c'est la même chose.


---------------
You can't start a fire with moonlight
Reply

Marsh Posté le 04-02-2008 à 14:03:33    

Trap D a écrit :


Je n'ai pas décortiqué l'algo du prof mais il me parait correct, je n'ai pas compris par contre pourquoi l'un des tableaux par de 0 et l'autre de 1 ???


 
Bah c'est histoire d'habituer les élèves à jouer avec des indices.


---------------
You can't start a fire with moonlight
Reply

Marsh Posté le 04-02-2008 à 15:58:56    

kyntriad a écrit :

Bah c'est histoire d'habituer les élèves à jouer avec des indices.

Pas convaincu du tout  :pt1cable:

Reply

Marsh Posté le 04-02-2008 à 16:02:34    

Trap D a écrit :

Pas convaincu du tout  :pt1cable:


 
Bah moi si :p
 
ça va un peu avec le côté j'tembrouille a trier les index et pas le tableau de base, et c'est un peu nécessaire de savoir jouer avec les indices pour programmer.


---------------
You can't start a fire with moonlight
Reply

Marsh Posté le 04-02-2008 à 16:36:29    

kyntriad a écrit :


 
Bah moi si :p
 
ça va un peu avec le côté j'tembrouille a trier les index et pas le tableau de base, et c'est un peu nécessaire de savoir jouer avec les indices pour programmer.

Autant je suis d'accord pour l'utilisation d'index différents pour une base de données, on peut avoir besoin de rechercher des données suivant des critères différents et donc là l'index est indispensable, autant faire débuter un tableau à 0 et l'autre à 1 me parait complètement artificiel.
Enfin ça n'est que mon avis et on ne va pas se battre pour ça. [:aldark]

Reply

Marsh Posté le 04-02-2008 à 17:07:04    

Trap D a écrit :

Autant je suis d'accord pour l'utilisation d'index différents pour une base de données, on peut avoir besoin de rechercher des données suivant des critères différents et donc là l'index est indispensable, autant faire débuter un tableau à 0 et l'autre à 1 me parait complètement artificiel.
Enfin ça n'est que mon avis et on ne va pas se battre pour ça. [:aldark]


 
Bah vui c'est complétement artificiel on est d'accord, c'est un exercice quoi  ;)


Message édité par kyntriad le 04-02-2008 à 17:07:25

---------------
You can't start a fire with moonlight
Reply

Marsh Posté le 08-02-2008 à 15:18:32    

L'index c'est pas juste pour embrouiller. Dans la pluspart des cas réels les tris sont faits sur un index et pas sur les vraies données, parce que déplacer un entier c'est quand même plus efficace que dépalcer des chaines de caractères ou autres structures volumineuses.

Reply

Marsh Posté le 08-02-2008 à 22:41:35    

matafan a écrit :

L'index c'est pas juste pour embrouiller. Dans la pluspart des cas réels les tris sont faits sur un index et pas sur les vraies données, parce que déplacer un entier c'est quand même plus efficace que dépalcer des chaines de caractères ou autres structures volumineuses.

Oui, c'est un peu ce que j'avais écrit quelques posts plus haut. [:bentley]
 

Reply

Marsh Posté le 09-02-2008 à 12:41:30    

Oups désolé j'avais pas vu ton post :whistle:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed