
Corrigé des exercices 3.3
–
si
q
= 2
q0
est pair, les tableaux sont fusionnés deux par deux pour former des tableaux triés de longueur
2pet le dernier de longueur rn’est pas fusionné ;
–
si
q
= 2
q0−
1 est impair, les tableaux sont fusionnés deux par deux pour former des tableaux triés de
longueur 2
p
et le dernier de longueur
p
est fusionné avec celui de longueur
r
pour former un tableau trié
de longueur p+r.
En posant
p0
= 2
p
et
r0
=
r
ou
t0
=
p
+
r
suivant la parité de
q
nous pouvons affirmer que
n
=
p0q0
+
r0
avec
0
6r0< p0
et le tableau
t
est maintenant constitué de
q0
tableaux triés de longueur 2
p
et d’un tableau trié de
longueur r0.
L’algorithme se termine lorsque p > n car alors q= 0 et r=n.
Exercice 5
a)
Lors du tri par insertion d’un tableau déjà 2-trié, le nombre maximal d’échanges est obtenu lorsque les
termes d’indices impairs sont tous inférieurs aux termes d’indices pairs. Dans cette situation, le nombre
d’échanges effectués est égal à 1 + 2 + ···+ln
2m=p(p+ 1)
2avec p=ln
2m.
Le tableau trié prend alors la forme : (a1,a3,a5,...,a0,a2,a4,...).
b)
Partons d’un tableau trié, par exemple (1
,
2
,
3
,
4). Pour que le nombre d’échanges par le 1-tri soit maximal, il
faut qu’à l’étape précédente on soit en présence du tableau (3
,
1
,
4
,
2). De même, pour que le nombre d’échanges
par le 2-tri soit maximal, il faut qu’à l’étape précédente on soit en présence du tableau (4,2,3,1).
Ce dernier tableau nécessite donc 5 échanges pour être trié par le tri de Shell : à la première étape (le 2-tri), 2
échanges le transforment en (3,1,4,2), à la seconde étape (le 1-tri), 3 échanges en transforment en (1,2,3,4).
C’est la même chose pour
n
= 8 en partant de (1
,
2
,
3
,
4
,
5
,
6
,
7
,
8). Avant le 1-tri, il faut avoir (5
,
1
,
6
,
2
,
7
,
3
,
8
,
4),
avant le 2-tri, (7
,
3
,
5
,
1
,
8
,
4
,
6
,
2), et avant le 4-tri, (8
,
4
,
6
,
2
,
7
,
3
,
5
,
1). Avec ce dernier tableau, le tri de Shell
effectue 20 échanges.
c)
Le tri de Shell étudié ici revient à trier récursivement les termes pairs et impairs séparément puis à appliquer
le 1-tri (le tri par insertion) au tableau obtenu. D’après la première question, le nombre maximal d’échanges
effectués vérifie la relation : C(2p) = 2C(2p−1) + 2p−1(2p−1+ 1)
2, soit : up= 2up−1+ 2p−2(2p−1+ 1).
Écrivons :
up
2p
=
up−1
2p−1
+
2p−1+ 1
4
de manière à réaliser un télescopage. Sachant que
u0
= 0 on obtient :
up
=
2p
p−1
X
k=0
2k+ 1
4= 2p−2(2p−1 + p) = 2p(2p−1)
4+p2p−2.
Lorsque
n
= 2
p
, le nombre d’échanges effectués est égal dans le pire des cas à
n(n−1)
4
+
nlogn
4
. Le coût reste
quadratique, mais asymptotiquement le nombre d’échanges est deux fois moindre que pour le tri par insertion.
Cela n’en reste pas moins mauvais, et d’autres choix pour la suite
hp
conduisent à de meilleurs résultats. Par
exemple, la suite définie par
hp
= 2
p−
1 conduit à un coût dans la pire des cas en
Θ
(
n3/2
) (Hibbard, 1963).
Mieux, la suite des nombres de la forme 2
a
3
b
conduit à un coût en
Θ
(
nlog2n
) (Pratt, 1971). Mais la recherche
de la meilleure suite de valeurs pour hpreste à l’heure actuelle un problème ouvert.
d) On écrit tout d’abord une fonction insertion qui réalise le h-tri d’un tableau.
def insertion(t, h):
for jin range(h, len(t)):
k=j
while k >= h and t[k] < t[k−h]:
t[k−h], t[k] = t[k], t[k−h]
k−= 1
Le tri proprement dit consiste essentiellement à calculer la plus grande valeur
hp
de la suite qui vérifie
hp6n<hp+1 puis à appliquer la fonction précédente avec hp,hp−1,...,h1= 1.
Jean-Pierre Becirspahic