Première NSI Mme Pierrot
Le tri à bulles
Thème :
• Les algorithmes de tri
• Notion de compléxité
Compétences à acquérir :
• utilisation de boucles imbriquées
• savoir dérouler un algorithme pas à pas
Éléments d’information et exemples.
Sitographie :
Bubble-sort with Gypsy folk dance : https://www.youtube.com/watch?v=lyZQPjUT5B4&t=1s Des animations pour comprendre les algorithmes de tri : http://lwh.free.fr/pages/algo/tri/tri.htm Doc.1 : Exemple
Le tri à bulles est une façon de trier un tableau, cette méthode n’est pas une des plus difficiles, elle n’est pas non plus une des plus rapides.
Au départ on a un tableau non trié (5, 1, 12,-5, 16).
Au début on analyse si le premier élément est supérieur au second (5 et 1) si c’est vrai on permute les deux éléments (swap), le 1 prend la place du 5. On continue.
On regarde si le deuxième élément est supérieur au troisième (ici 5 et 12). Comme 5 n’est pas supérieur à 12 on ne fait rien. On continue à regarder si on doit permuter les deux éléments contigus jusqu’à la fin du tableau. A la fin de cette première boucle le tableau n’est pas complètement trié.
Il faut recommencer à regarder si le premier élément est supérieur au deuxième puis si le deuxième est supérieur au troisième etc... À chaque fois
on fait des permutations si l’élément N est supérieur à l’élément N+1.
On va voir des bulles remonter d’où le nom du tri.
Quand sait-on que le tableau est trié et que l’on doit arrêter le tri?
Quand on ne fait plus aucune permutation dans le tableau (utiliser un booléen qui indique s’il y a eu des permutations).
Travail à réaliser
I- Programmation
1) Regarder la vidéo proposée sur YouTube qui illustre l’algorithme du tri à bulle.
2) Écrire l’algorithme en vous inspirant de la vidéo et du doc. 1
3) Tester cet algorithme manuellement pour deux exemples de listes : [4, 5, 1, 3] puis une de votre choix.
4) Coder l’algorithme en Python dans une fonction triabulle(liste) 5) Le tester avec une liste aléatoire de 50 entiers.
II- Notion de complexité
1) De la même façon que sur cette page : http://lwh.free.fr/pages/algo/tri/tri_bulle.html lors du tri de tonneaux on compte le nombre de comparaisons et de déplacements effectués, comptabiliser le nombre de comparaisons et de déplacements effectués lors d’un tri des listes de cinq nombres suivantes : [4,1,5,2,3] ; [1,2,3,4,5] ; [5,4,3,2,1]
2) Quelle est la meilleur configuration initiale ? La pire ? Pourquoi ?
Première NSI Mme Pierrot
III- Amélioration
« Le tri "Shaker", également appelé tri "Cocktail", tri "Shuttle", tri "boustrophédon" ou tri à bulles bidirectionnel est une variante du tri à bulles.
Son principe est identique à celui du tri à bulles, sauf qu'il change de direction à chaque passe. C'est une légère amélioration car il permet non seulement aux plus grands éléments de migrer vers la fin de la série mais également aux plus petits éléments de migrer vers le début. »
a) Modifier votre fonction « triabulle » pour faire une nouvelle fonction « shaker » qui améliore le tri à bulle en le rendant bidirectionnel.
IV- Comparaison des temps d’exécution des différents algorithmes de tri.
Utiliser les fonctions tic() et toc() pour comparer le temps de tri d’un tableau contenant un grand nombre de valeurs aléatoires (10000 ?) comprises entre -100 et +100 pour les trois algorithmes mis en œuvre :
• Tri par sélection
• Tri à bulle
• Tri shaker Pour rappel :
import time as t
# Définition de vos fonctions de tri…
def tic() :
return t.time() def toc(tinit) :
return t.time() - tinit
# Création d’une grande liste t1 = tic()
l1 = triparselection(liste) duree1 = toc(t1)
t2 = tic()
l2 = triabulle(liste) duree2 = toc(t2) .
. .