INFO I Tris et recherche TP 4 Algorithmes de tri Dans cette section, nous considérons une liste L, dont nous appellerons n la longueur par la suite, et que nous souhaitons ordonner, c’est-à-dire classer ses éléments du plus petit au plus grand. Il existe plusieurs méthodes. 1. Tri à bulles Principe ã Étape 1 : on fait « remonter » le maximum de L vers la droite de la manière suivante. On compare les deux premiers éléments (numéro 0 et 1) de L et on les permute si le premier est plus grand que le second ; ensuite on recommence avec les éléments 1 et 2 et ainsi de suite jusqu’aux deux derniers éléments. À l’issue de cette première étape, le dernier élément est le plus grand. ã Étape 2 : on fait de même en n’observant que les n−1 premiers éléments de L (c’est-à-dire L[:−1]). ã Ainsi de suite... Jusqu’à l’étape n−1. Cet algorithme porte le nom de tri à bulles, car le plus grand élément remonte petit à petit vers le « haut », comme une bulle ! Exemple 1. L désigne la liste L = [6,2,8,5,4,1]. Les étapes successives sont les suivantes. L L L L L = = = = = [2,6,5,4,1,8] [2,5,4,1,6,8] [2,4,1,5,6,8] [2,1,4,5,6,8] [1,2,4,5,6,8] Exercice 1. HHI Tri à bulles Implémenter l’algorithme de tri à bulles dans une fonction. 2. Tri par insertion Principe ã Étape 1 : ordonner la sous-liste formée des deux premiers éléments de L. ã Étape 2 : insérer l’élément de place 2 dans la sous-liste L[0:2] de manière à ce que la sous-liste L[0 :3] soit ordonnée. ã et ainsi de suite jusqu’à l’étape n−1. En d’autres termes, il s’agit d’ordonner petit à petit la liste L en insérant, à l’étape k, l’élément L[k+1] au « bon endroit » dans L[:k+1]. Exemple 2. L désigne la liste L = [6,2,8,5,4,1]. Les étapes successives sont les suivantes. L L L L L L = = = = = = [6,2,8,5,4,1] [2,6,8,5,4,1] [2,6,8,5,4,1] [2,5,6,8,4,1] [2,4,5,6,8,1] [1,2,4,5,6,8] 1/3 j.verliat.free.fr Exercice 2. HHH Tri par insertion Implémenter l’algorithme de tri par insertion dans une fonction. II Algorithmes de recherche Dans cette section, nous souhaitons savoir si, étant donnée une liste L, celle-ci contient un objet donné a. 1. Recherche dans une liste quelconque Dans une liste quelconque, on peut simplement parcourir la liste jusqu’à ce que l’élément soit trouvé ou que la fin de la liste soit atteinte. Le principe est élémentaire, mais si la liste est longue, le temps de recherche peut être long. Exercice 3. III Algorithme de recherche élémentaire Implémenter l’algorithme de recherche élémentaire dans une fonction recherche. On s’interdira toute utilisation de la fonction Python in. 2. Recherche dans une liste triée Dans une liste triée, on peut proposer des méthodes assez simples et néanmoins beaucoup plus rapides. a) Recherche séquentielle Principe On passe en revue la liste tant que les éléments sont plus petits que a, jusqu’à : ã obtenir un élément égal à a, auquel cas on conclut que a appartient à L ã obtenir un élément strictement plus grand que a, auquel cas on conclut que a n’appartient pas à L. Exercice 4. HII Algorithme de recherche séquentielle Implémenter l’algorithme de recherche séquentielle dans une fonction recherche_seq. b) Recherche par dichotomie Principe On pose c=len(L)//2. On modifie la liste L tant que L est composée de strictement plus d’un élément et que a et L[c] sont différents, de la manière suivante : ã si a est strictement supérieur à L[c], la liste L devient la sous-liste des éléments de L de place k avec k>c ; ã si a est strictement inférieur à L[c], la liste L devient la sous-liste des éléments de L de place k avec k<c. Exemple 3. L désigne la liste [1,3,4,6,7,8,11,13,15,18,20] et a l’entier 14. Les étapes successives sont les suivantes. L = [1,3,4,6,7,8,11,13,15,18,20], c=5, L(5)=8, a>L(5) L = [11,13,15,18,20], c=2, L(2)=15, a<L(2) L = [11,13], c=1, L(1)=13, a>L(1) L = [], donc a n’appartient pas à L Exercice 5. HHI Algorithme de recherche par dichotomie Implémenter l’algorithme de recherche par dichotomie dans une fonction recherche_dicho. Exercice 6. HHH Algorithme récursif de recherche par dichotomie Proposer une version récursive : recherche_dicho_rec. 2/3 Tris et recherche c) Comparaison de l’éfficacité des algorithmes de recherche Les trois (voire quatre) algorithmes de recherche dans une liste triée que l’on vient de voir utilisent des méthodes différentes pour rechercher un élément dans une liste. De ce fait, ils ne vont pas mettre le même temps pour trouver (éventuellement) un élément donné dans une liste donnée. La bibliothéque time dispose d’une fonction time qui permet d’évaluer le temps mis par l’ordinateur pour exécuter une liste de commandes. Essayer les commandes suivantes : import time deb=time.time() time.sleep(1) fin=time.time() print(fin-deb) Exercice 7. HII Comparaison des algorithmes de tris 1. Évaluer le temps de recherche des différents algorithmes, sur quelques exemples. 2. Comparer les temps de recherche sur des exemples de listes non triées. Les fonctions recherche_seq et recherche_dicho devront être modifiées afin de prévoir un tri préalable de la liste... On pourra par exemple comparer les différentes méthodes de recherche sur des listes composées d’un grand nombre d’entiers pseudo-aléatoires. 3/3