TP 4 - Free

publicité
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
Téléchargement