Académique Documents
Professionnel Documents
Culture Documents
On rappelle que l’accès à des données triées est plus rapide (par exemple par utilisation d’un algorithme
dichotomique) que des données non triées (penser par exemple à un dictionnaire dont les mots ne seraient
pas triés par ordre alphabétique).
Tous les algorithmes de tri reposent sur la comparaison de deux éléments entre eux (donc des paires
particulières de la liste à trier). Une telle comparaison sera appelée comparaison binaire. L’objectif étant de trier
la liste en effectuant le moins de comparaisons binaires possible et en déplaçant le moins de données possible
en mémoire.
1.1.1 Algorithme
L Début
n=0
non
L[s]=tmp n=n+1 n<len(L) ? Fin
L[n]=L[s] oui
s=n
non
k=s+1
L
tmp=L[n] s ‰ n? k<len(L) ?
oui non
oui
non
L[k]<L[s] ? k=k+1
oui
s=k
1.1.2 Simulation sur un exemple
Appliquer l’algorithme de tri précédent à la liste de cartes suivante :
En pratique :
• On considère que la position tout à gauche est la position 0 ;
• Les variables s et n sont des entiers représentant des positions dans la liste. Vous les repèrerez en utilisant
deux morceaux de papier marqués l’un d’un s et l’autre d’un n. Ils seront placés au dessus de la carte
de la liste occupant la position correspondant à la valeur de la variable. Vous déplacerez les marques en
papier au fur et à mesure de l’exécution de l’algorithme.
• L’entier k sera représenté par votre index ;
• La variable tmp sera représentée par une zone géographique de votre table de travail ;
• tmp=L[p] sera interprété comme le déplacement de la carte occupant la position p de la liste vers la zone
tmp ;
• L[p]=L[q] sera interprété comme le déplacement de la carte se trouvant en position q vers la position p ;
• L[p]=tmp sera interprété comme le déplacement de la carte occupant la zone tmp vers la position p de
la liste ;
• A chaque déplacement de carte, le lieu d’arrivée doit être vide (sinon c’est qu’il y a un problème dans
l’algorithme...).
Lors de l’exécution de l’algorithme vous observerez :
• L’ordre des cartes se trouvant avant la position marquée par n ;
• Le nombre de déplacements effectués par chaque carte ;
• Le nombre de comparaisons binaires effectuées.
Vous répondrez également aux questions :
1. Le test s ‰ n est-il utile ? Si oui à quoi ?
2. Lors de l’exécution de l’algorithme, sur l’exemple proposé, combien effectue-t-on de comparaisons de
cartes ? Combien de déplacements de cartes ?
1.1.3 Remarque
La liste est donc parcourue de nombreuses fois : autant de fois que d’éléments même si les parcours deviennent
de plus en plus courts (vu qu’on ne démarre pas du début à chaque fois). Le nombre de comparaisons binaires
à effectuer est donc important.
n=1
non
n=n+1 n<len(L) ? Fin
oui
tmp=L[n]
s=n-1
L
s • 0 et
L[s+1]=tmp
non L[s]>tmp ?
oui
L[s+1]=L[s] s=s-1
En pratique :
• On considère que la position tout à gauche est la position 0 ;
• Les variables s et n sont des entiers représentant des positions dans la liste. Vous les repérerez en utilisant
deux morceaux de papier marqués l’un d’un s et l’autre d’un n. Ils seront placés au dessus de la carte
de la liste occupant la position correspondant à la valeur de la variable. Vous déplacerez les marques en
papier au fur et à mesure de l’exécution de l’algorithme.
• La variable tmp sera représentée par une zone géographique de votre table de travail ;
• tmp=L[p] sera interprété comme le déplacement de la carte occupant la position p de la liste vers la zone
tmp ;
• L[p]=L[q] sera interprété comme le déplacement de la carte se trouvant en position q vers la position p ;
• L[p]=tmp sera interprété comme le déplacement de la carte occupant la zone tmp vers la position p de
la liste ;
• A chaque déplacement de carte, le lieu d’arrivée doit être vide (sinon c’est qu’il y a un problème dans
l’algorithme...).
Lors de l’exécution de l’algorithme vous observerez :
• L’ordre des cartes se trouvant avant la position marquée par n ;
• Le nombre de déplacements effectués par chaque carte ;
• Le nombre de comparaisons binaires effectuées.
Vous répondrez également aux questions :
1. Lors de l’exécution de l’algorithme, sur l’exemple proposé, combien effectue-t-on de comparaisons de
cartes ? Combien de déplacements de cartes ?
On remarque :
• le pivot se trouve placé directement à la bonne place après la réorganisation ;
• Le paquet de droite et de gauche ne sont pas nécessairement ordonnés et sont à priori de cardinal différent.
On peut donc par récursivité appliquer la méthode sur ces deux paquets.
s=0
n=1
non
n=n+1 n<len(L) ? échanger L[0] et L[s]
Fin
oui
L[n] <
non
L[0] ?
L
oui
s=s+1
En pratique :
• On considère que la position tout à gauche est la position 0 ;
• Les variables s et n sont des entiers représentant des positions dans la liste. Vous les repérerez en utilisant
deux morceaux de papier marqués l’un d’un s et l’autre d’un n. Ils seront placés au dessus de la carte
de la liste occupant la position correspondant à la valeur de la variable. Vous déplacerez les marques en
papier au fur et à mesure de l’exécution de l’algorithme.
Lors de l’exécution de l’algorithme vous observerez :
• L’ordre des cartes se trouvant avant la position marquée par s ;
• Le nombre de déplacements effectués par chaque carte ;
• Le nombre de comparaisons binaires effectuées.
Vous répondrez également aux questions :
1. Lors de l’exécution de l’algorithme, sur l’exemple proposé, combien effectue-t-on de comparaisons de
cartes ? Combien de déplacements de cartes ?
Dans l’exemple précédent, après la première étape de réorganisation avec 9 comme pivot, on obtient la liste :
et
et ainsi de suite jusqu’à tomber sur des listes vides ou ne contenant qu’un seul élément (qui sont donc déjà
triées). On remarque que le pivot est directement placé au bon endroit après la réorganisation.
Pour éviter de dupliquer des parties de la liste, on utilise un système d’index qui indique sur quelle partie
de la liste on applique l’algorithme de réorganisation. Les détails seront donnés en travaux pratiques lors de
l’implémentation en Python du programme.
1.4 Tri fusion
L’idée du tri fusion est de couper la liste à trier en deux parties (en général on coupe en deux parties de même
cardinal), de trier chacune d’entre elles puis de les fusionner. Evidemment, chaque sous-partie sera elle-même
triée par la même méthode en utilisant la récursivité. Le point clé de la méthode est la fusion d’une liste en
deux parties dont chacune d’entre elles est déjà triée. Autrement dit, le passage de :
tmp=L[0 :p+1]
n=0 ; k=0
s=p+1
non
n § p? Fin
oui
L
s • lenpLq
ou
oui non
tmprns §
Lrss ?
L[k]=tmp[n] L[k]=L[s]
n=n+1 s=s+1
k=k+1
1.4.2 Simulation de l’algorithme de fusion de deux sous-listes triées
Appliquer l’algorithme de tri précédent à la liste de cartes suivante avec p “ 2 :
En pratique :
• On considère que la position tout à gauche est la position 0 ;
• Les variables s, n, k sont des entiers représentant des positions dans une liste. Vous les repérerez en
utilisant des morceaux de papier marqués d’un s d’un n ou d’un k au dessus de la carte dont ils désignent
la position. Vous déplacerez les marques en papier au fur et à mesure de l’exécution de l’algorithme.
• Xrxs “ Y rys sera interprété par le déplacement de la carte en position y de la liste Y vers la position x
de la liste X.
• La liste tmp sera représentée en dessous de la liste L en gardant les alignements.
Autrement dit, avant la première exécution de l’instruction n § p, vous devez avoir sur votre table :
indicateurs k,n s
Liste L
Liste tmp