TP - Algorithmes de tri☘
Dans le dossier [NSI], commencez par créer le dossier [E01-Diviser_Regner].
Ce TP est partagé en deux parties :
-
Dans la première partie, il est demandé d'implémenter l'algorithme de tri fusion de manière récursive (comme étudié en classe) puis impérative.
-
Dans la seconde partie, il faut implémenter d'autres algorithmes de tri puis comparer graphiquement l'efficacité de ces algorithmes à l'aide d'une fonction fournie.
TPE01.11 - Tri Fusion☘
Téléchargez le fichier « à trous » TPE01.11.py (clic droit -> [Enregistrer la cible du lien sous]) et enregistrez-le dans le dossier [E01-Diviser_Regner].
-
Si vous ne l'avez pas encore programmée en exercice, complétez la définition de la fonction
tranche()
qui renvoie un tableau contenant les éléments situés entre les indicesi
(inclus) etj
(exclus) du tableautab
passé en paramètre.
Utilisez une assertion sur les valeurs des paramètres1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
def tranche(tab, i, j): """ tab – list, un tableau i, j - int, entiers positifs tels que 0 <= i <= j <= len(tab) Sortie: list – tableau contenant les éléments de tab situés entre les indices i (inclus) et j (exclus) >>> tranche([1, 2, 4, 8, 16, 32], 2, 5) [4, 8, 16] >>> tranche([1, 2, 4, 8, 16, 32], 4, 6) [16, 32] >>> tranche([1, 2, 4, 8, 16, 32], 4, 4) [] >>> tranche([1, 2, 4, 8, 16, 32], 4, 5) [16] """
i
etj
. -
Complétez la définition de la fonction
fusionner()
qui prend en paramètre deux tableaux dont les éléments sont triés par ordre croissant et qui renvoie un seul tableau contenant l'ensmble des éléments (toujours triés en ordre croissant).1 2 3 4 5 6 7 8 9
def fusionner(tab1, tab2): """ tab1, tab2 – list, deux tableaux d'éléments comparables et triés par ordre croissant Sortie: list – tableau contenant les éléments de tab1 et tab2 triés par ordre croissant >>> fusionner([1, 2, 8, 32], [4, 8, 16, 32]) [1, 2, 4, 8, 8, 16, 32, 32] >>> fusionner([1, 2, 4], [8, 16, 32]) [1, 2, 4, 8, 16, 32] """
-
Complétez la définition récursive de la fonction
tri_fusion()
qui prend en paramètre un tableau et qui renvoie un tableau contenant les mêmes éléments mais triés par ordre croissant.
Dans le1 2 3 4 5 6 7
def tri_fusion(tab): """ tab – list, tableau d'éléments comparables Sortie: list – tableau contenant les mêmes éléments mais triés par ordre croissant >>> tri_fusion([4, 8, 1, 32, 16, 8, 2, 32]) [1, 2, 4, 8, 8, 16, 32, 32] """
main
, ajoutez un test de cette fonction sur un tableau d'entiers générés aléatoirement. -
Complétez la définition impérative de la fonction
tri_fusion_imp()
qui prend en paramètre un tableau et qui renvoie un tableau contenant les mêmes éléments mais triés par ordre croissant.
Cette fonction pourra toujours faire appel à la fonction1 2 3 4 5 6 7
def tri_fusion_imp(tab): """ tab – list, tableau d'éléments comparables Sortie: list – tableau contenant les mêmes éléments mais triés par ordre croissant >>> tri_fusion([4, 8, 1, 32, 16, 8, 2, 32]) [1, 2, 4, 8, 8, 16, 32, 32] """
fusionner()
définie à la question 2..Une illustration vidéo
Un algorithme
-
Construire un tableau dont les éléments sont des tableaux contenant chacun un seul des éléments de
tab
. -
Parcourir ce tableau par pas de 2 et placer dans un tableau temporaire la fusion des sous-tableaux deux par deux (attention, il peut y avoir un nombre impair de sous-tableaux).
-
Recopier le contenu du tableau temporaire dans le tableau de travail.
-
Poursuivre jusqu'à n'avoir plus qu'un sous-tableau dans le tableau de travail : ce sous tableau est trié.
-
TPE01.12 - Comparer des algorithmes de tri☘
Téléchargez le fichier « à trous » TPE01.12.py (clic droit -> [Enregistrer la cible du lien sous]) et enregistrez-le dans le dossier [E01-Diviser_Regner].
Dans ce fichier, une implémentation du tri fusion est déjà réalisée.
-
Programmez l'algorithme de tri par sélection (du maximum) en reprogrammant la définition de la fonction
tri_selection()
plutôt qu'en copiant un travail déjà réalisé ultérieurement.Rappel
Vous pouvez aussi programmer des fonctions supplémentaires si vous en avez besoin...
-
Programmez l'algorithme de tri par insertion en reprogrammant la définition de la fonction
tri_insertion()
plutôt qu'en copiant un travail déjà réalisé ultérieurement. -
Complétez la définition de la fonction
tri_bulle()
qui implémente le tri à bulle dont l'algorithme est détaillé ci-dessous :Algorithme du tri à bulles
Le principe consiste à faire remonter progressivement les plus grands éléments à la fin du tableau :
- On parcourt le tableau du début à la fin en comparant les éléments deux à deux. S’ils ne sont pas dans l’ordre croissant, ils sont permutés.
- On recommence jusqu'à ce que plus aucune permutation ne soit possible. Le tableau est alors trié.
-
Complétez la définition récursive de la fonction
tri_rapide()
qui implémente le tri rapide dont l'algorithme est détaillé ci-dessous :Algorithme du tri rapide
Le principe consiste à classer les éléments autour d'un pivot (les éléments de valeur plus petite sont placés à gauche, ceux de valeur plus grande sont placés à droite) :
- Si le tableau ne contient qu'un seul élément (ou aucun), on le renvoie.
- Sinon :
- Le pivot est le premier élément du tableau ;
- Un tableau « à gauche » contient tous les éléments strictement inférieurs au pivot ;
- Un tableau « à droite » contient tous les éléments strictement supérieurs au pivot ;
- On renvoie un tableau constitué du tableau gauche trié par tri rapide, du pivot puis du tableau droit trié par tri rapide.
Attention de bien prendre en compte le cas de valeurs égales...
-
Téléchargez le fichier suivant : TPE01.12_compare.py et enregistrez-le dans votre répertoire de travail.
Ce fichier fait appel au fichier TPE01_12.py complété dans cette partie.
Exécutez ce fichier afin de visualiser la complexité des tris ainsi implémentés.Graphique à obtenir
Voici un exemple de graphique que l'on peut obtenir :