tris quadratiques et tri à partir d'une cle
Utiliser Pyzo, ou IDLE ou autre IDE Python pour ce TP. Les 3 parties sont indépendantes, et peuvent être placées dans 3 fichiers python différents.
Partie 1: découvrir le tri par insertion et par séléction
Tri par insertion
- Ecrire en utilisant uniquement des lignes de code choisies parmi les lignes suivantes, une fonction de tri par insertion qui retourne la liste placée en argument avec ses éléments classés par ordre croissant. Les lignes ne sont pas toutes à utiliser et l’indentation est à adapter.
- Utiliser cette fonction pour trier chacune des listes suivantes:
Ajouter une instruction dans la fonction
tri_insertionpour suivre l’évolution du tri à chaque tour de la boucle externe.
Recopier et completer le tableau de suivi (cahier):
| tour | i |
L1 |
|---|---|---|
| debut du tour 1 | 1 | [19, 8, 10, 1, 2, 50, 3, 5] |
| fin du tour 1 | 1 | |
| fin du tour 2 | 2 | |
| fin du tour 3 | 3 | |
| fin du tour 4 | 4 | |
| fin du tour 5 | 5 | |
| fin du tour 6 | 6 | |
| fin du tour 7 | 7 |
- Ecrire une fonction
est_trieepour vérifier si les éléments d’une liste sont placés dans l’ordre croissant.
Utiliser la base suivante pour la fonction: (et compléter):
- Ajouter un test d’assertion pour chacune de ces listes pour vérifier que la fonction a bien effectué le tri sur ces listes.
Tri par séléction
- Ecrire la fonction
tri_selectionà partir des lignes suivantes (idem question 1 plus haut)
- Utiliser cette fonction pour trier chacune des listes suivantes:
Ajouter une instruction dans la fonction
tri_insertionpour suivre l’évolution du tri à chaque tour de la boucle externe.
Recopier et completer le tableau de suivi:
| tour | i |
L1 |
|---|---|---|
| debut du tour 1 | 0 | [19, 8, 10, 1, 2, 50, 3, 5] |
| fin du tour 1 | 0 | |
| fin du tour 2 | 1 | |
| fin du tour 3 | 2 | |
| fin du tour 4 | 3 | |
| fin du tour 5 | 4 | |
| fin du tour 6 | 5 |
Question 1: le tableau est-il différent de celui obtenu pour le tri par insertion? Quelles sont ces différences?
- Ajouter les tests d’assertion pour vérifier que la fonction a bien effectué le tri sur ces listes.
Partie 2: Appliquer un algorithme de tri
Nous allons appliquer les 2 algorithmes de tri (insertion et selection) sur des listes non ordonnées.
Mélanger un liste de mots
- (1) Télécharger et placer le fichier index de mots français pli07.zip. Dézipper ce fichier dans un dossier que vous appelerez recherche_et_tri.
- (2) Ouvrir un nouveau fichier python dans le même dossier. Placer l’import des librairies
randomettimeà l’ouverture de ce fichier (premières lignes):
- (3) Ajouter au script python les fonctions de tri vues dans le cours: Lien vers le cours
- (4) importer une liste de mots d’un dictionnaire non accentué. Appeler cette liste
mots.
- (5) mélanger la liste de mots avec la fonction
random.shuffle(voir exemple plus bas) - (6) réduire cette liste à seulement 10000 mots:
mots = mots[:10000] - (7) copier cette liste de mots (faire une copie par valeur):
mots_melanges = mots.copy()
Aide:
La fonction shuffle du module random permet de mélanger en place les éléments d’une liste. Exemple:
-
(8) Programmer une fonction
est_trieequi vérifie si la liste est bien triée. Cette fonction sera utile pour contrôler que la fonction de tri effectue bien le tri demandé. (voir partie 1) -
(9) Utiliser cette fonction pour vérifier que la liste
motsest mélangée:
Trier le dictionnaire de mots
Votre script devrait avoir l’allure suivante: (Voir l’aide)
Vous allez tester maintenant vos fonctions de tri sur la liste de mots, une fois celle-ci mélangée et placée dans une copie.
- Question 2: Mesurer le temps mis pour trier la liste de mots à l’aide du tri par insertion. (faire plusieurs essais).
Remarque: Si vous voulez comparer 2 algorithmes de tri en place, sur la même liste, il faudra utiliser une copie par valeur de la liste mélangée. Le tri par insertion puis par selection doit être realisé sur la MEME liste si vous voulez comparer les durées de traitement.
On rappelle que la mesure du temps peut être réalisée de la manière suivante:
- Pour le tri par insertion:
-
Question 3: Mesurer le temps mis pour trier la liste de mots à l’aide du tri par selection. (faire plusieurs essais). Comparer le temps mis par les 2 algorithmes de tri. Conclure.
-
Question 4: Evaluer la complexité algorithmique pour chacun de ces algorithmes. Les résultats mesurés sont ils conformes à ce qui est attendu?
Partie 3: TP tri à partir d’une clé
On peut réaliser un tri à l’aide d’une clé. Les objets (les lignes d’un fichier csv) contiennent ainsi des valeurs sur plusieurs colonnes. On peut choisir l’une de ces colonnes pour réaliser le tri.
On prendra pour exemple le fichier du classement UEFA des équipes feminines sur plusieurs années. Le tableau est consultable à la page de l’UEFA.com
import du fichier csv
- -> fichier csv classement_uefa.csv à telecharger
Ci-dessous, le programme minimal pour lire le fichier csv. Testez le à l’aide d’un IDE (Pyzo ou autre). Adaptez si necessaire le chemin vers le fichier:
La premiere ligne contient l’en-tête du tableau. Il faudra supprimer cette premiere ligne:
Nettoyer les données
La valeur de la colonne d’indice 8 contient la chaine de caractères (str) '11,715'. Il faudra transformer cette valeur en (float) 11.75
Même traitement avec la colonne 7.
On peut utiliser la méthode de chaine replace:
Importer à nouveau le tableau source, puis faire ce traitement sur les 114 équipes du tableau
teams. (Utiliser une boucle for)
Classement par indice UEFA: colonne 7
Au depart les équipes sont classées par ordre alphabetique:
On veut adapter l’agorithme de tri par selection pour classer les equipes selon une clé, qui sera l’indice de la colonne contenant les points UEFA de l’équipe.
A vous de jouer: adapter le script des algorithmes de tri:
- Ajouter un nouveau paramètre
cleaux fonctionstri_insertionettri_selection.- Adapter les programmes des 2 fonctions pour trier par rapport à une clé. Modifier par exemple la condition dans la boucle
forde la fonction de recherche du minimum (ttri par selection) avecif T[k][cle]<T[indiceDuMin][cle] :- Trier maintenant la liste
teamsselon la colonne de rang 7.
Si vous affichez cette liste, elle presente 2 inconvenients:
- elle est triée telle que l’equipe la plus faible est au debut du tableau et la meilleure à la fin.
- l’affichage ne facilite pas la lecture
- Modifier la fonction de tri pour réaliser un tri par l’élément le plus grand d’abord.
- Question 5: Quel est le classement UEFA des équipes entre la $1^{ere}$ et la $5^e$ equipe?
Classement par coefficient des associations: colonne 8
Le classement par coefficient des associations ou des pays prend en compte les résultats de tous les clubs d’une association. Il est utilisé pour déterminer le nombre de clubs que pourra engager une association dans les compétitions de l’UEFA les saisons suivantes. C’est la valeur de la colonne 8.
- Classer les équipes par coefficient des associations.
- Question 6: Quel est le nouveau classement des équipes entre la $1^{ere}$ et la $5^e$ equipe?
Nettoyer les résultats
On souhaite obtenir l’affichage suivant, avec seulement les colonnes equipe, pays, indice uefa:
- Ajouter les instructions suivantes qui permettront d’afficher les equipes :
- Créer un tableau vide T.
- faire une boucle bornée
forsur la listeteams:for t in range(...) - Dans la boucle for, à chaque itération, ajouter dans T un tuple constitué des colonnes 0, 1 et 7 pour chacune des équipes.
- afficher classement et equipe avec :
print(t,T[t])
Liens
- Cours/TD de mcoillac sur le tri par insertion et le tri par selection