Le tri de Shell applique le tri par insertion à des éléments distants…
Exercice supplémentaire · niveau 2 · NSI (première), chapitre 7 — Parcourir, trier, prouver · D'autres tris que les deux du programme
Énoncé
Le tri de Shell applique le tri par insertion à des éléments distants de , en divisant par deux à chaque étape. Le mesurer contre le tri par insertion ordinaire.
Corrigé
def tri_shell(t):
"""Tri par insertion à pas décroissant."""
n = len(t)
gap = n // 2
while gap > 0:
for i in range(gap, n):
x = t[i]
j = i
while j >= gap and t[j - gap] > x:
t[j] = t[j - gap]
j = j - gap
t[j] = x
gap = gap // 2
Validation : tableaux tirés au hasard — cas passent. Remarquez que la dernière étape, , est exactement le tri par insertion du cours : la correction est donc acquise quoi que fassent les étapes précédentes. Elles ne servent qu'à réduire le désordre.
La mesure, sur des tableaux aléatoires.
| Shell | rapport | insertion | rapport | |
|---|---|---|---|---|
| --- | --- | |||
Les rapports de Shell tournent autour de — nettement sous le du quadratique, sans être le franc d'un coût linéaire. Ceux de l'insertion oscillent autour de , comme attendu.
Pourquoi cela marche. Le résultat de l'exercice de TD sur les inversions donne l'explication complète : le coût du tri par insertion est proportionnel au nombre d'inversions. Les passages à grand pas déplacent les éléments de loin, donc suppriment beaucoup d'inversions d'un coup ; quand arrive le passage , il ne reste presque rien à faire.
Une honnêteté nécessaire. Le coût exact du tri de Shell dépend de la suite de pas choisie, et pour la suite « diviser par deux » employée ici, il n'est pas connu sous forme close — c'est un problème ouvert. Les rapports mesurés décrivent nos quatre tailles ; ils ne démontrent pas de loi. Dire « environ , sur cette plage » est tout ce qu'on peut affirmer.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.