TD 6 : tri rapide

publicité
PARIS
.
DIDEROT
université
L2 informatique - Année 2016–2017
TD d’Éléments d’Algorithmique n◦ 6
PARIS 7
Exercice 1. Tri rapide.
1. Exécutez à la main l’algorithme de tri rapide sur le tableau
T= 3
6
5
1
7
2
4
en supposant que la position du pivot dans l’appel quicksort(t,g,d) est toujours d.
Combien avez-vous fait de comparaisons ?
2. Donnez un tableau t de 7 entiers (une permutation des entiers de 1 à 7, par exemple) tel
que le nombre de comparaisons effectuées lors de l’appel quicksort(t,0,6) soit le plus
grand possible, pour le même choix de pivot qu’au point précédent. Quel est ce nombre ?
3. On rappelle qu’un algorithme de tri est stable s’il ne change pas l’ordre relatif d’éléments
équivalents. Par exemple, si on trie stablement un tableau de couples d’entiers par rapport
aux premières composantes des couples, et si (1, 1) précède (1, 0) avant le tri, alors (1, 1)
précède (1, 0) après le tri.
(a) Le tri rapide est-il stable ?
(b) Le tri fusion est-il stable ?
Exercice 2. Recherche dichotomique.
La recherche d’un élément dans un tableau non trié de taille n coûte n comparaisons dans
le cas pire.
1. Voici un premier algorithme de recherche d’un élément dans un tableau trié :
1
2
3
4
5
6
7
8
9
recherche ( el , T ) :
for i from 0 to T . length -1 {
if ( t [ i ]= el ) {
return i
} else if ( t [ i ] > el ) {
return -1
}
return -1
}
Quelle est la complexité de cet algorithme en fonction de la taille de T, en termes du
nombre de comparaisons effectuées dans le pire des cas ?
2. Pour exploiter efficacement le caractère trié du tableau, il faut commencer par comparer
l’élément cherché et l’élément central du tableau, puis si l’élément cherché est plus petit
que l’élément central, continuer la recherche dans la première moitié du tableau 1 , sinon
dans la deuxième moitié, et ainsi de suite tant qu’on ne trouve pas l’élément cherché et
qu’il reste de la place où le chercher.
Proposez un algorithme récursif rechercheDichotomique qui mette en œuvre l’idée donnée ci-dessus.
3. Donnez une version itérative de ce même algorithme.
4. Appliquez l’algorithme du point précédent pour vérifier si 6 apparaît dans le tableau trié
1 2 3 4 5 7 8 9 10
1. L’élément cherché ne peut pas se trouver dans l’autre moitié.
1
5. Quelle est la complexité de la recherche dichotomique dans un tableau trié T en fonction
de la taille de T, en termes du nombre de comparaisons effectuées dans le pire des cas ?
Exercice 3. Tableaux zigzag.
1
2
zig (T ,i , j ) :
return ( i = j || ( T [ i ] <= T [ i +1] && zag (T , i +1 , j )))
3
4
5
1
2
zag (T ,i , j ) :
return ( i = j || ( T [ i ] >= T [ i +1] && zig (T , i +1 , j )))
zigzag ( T ) :
return zig (T ,0 , T . length -1)
1. Exécutez à la main zigzag({1,2,3,4}) et zigzag({1,3,2,4}).
2. Que calcule zigzag (T) ?
3. Est-ce que les appels mutuellement récursifs de zag et zig sont terminaux ?
4. Donner une version itérative de zigzag.
5. Un tableau d’entiers T est en forme zigzag si zigzag(T) renvoie true. Écrivez un algorithme qui met un tableau en forme zigzag. Quelle est sa complexité ?
2
Téléchargement