Écrire le tri fusion : couper en deux, trier chaque moitié, fusionner.
Exercice supplémentaire · niveau 3 (difficile) · NSI (première), chapitre 7 — Parcourir, trier, prouver · D'autres tris que les deux du programme
Énoncé
Écrire le tri fusion : couper en deux, trier chaque moitié, fusionner. Mesurer ses comparaisons sur cinq tailles, et identifier la loi par les rapports.
Corrigé
def fusionner(a, b):
"""Fusionne deux tableaux TRIÉS en un seul tableau trié."""
res = []
i = j = 0
while i < len(a) and j < len(b):
if a[i] <= b[j]:
res.append(a[i]); i = i + 1
else:
res.append(b[j]); j = j + 1
res.extend(a[i:])
res.extend(b[j:])
return res
def tri_fusion(t):
"""Trie t. Rend un tableau NEUF."""
if len(t) <= 1:
return list(t)
m = len(t) // 2
return fusionner(tri_fusion(t[:m]), tri_fusion(t[m:]))
Validation : tableaux tirés au hasard — cas passent.
La mesure, sur des tableaux aléatoires.
| tri fusion | rapport | |||
|---|---|---|---|---|
| --- | ||||
Comment les rapports identifient la loi. Ils valent un peu plus de , et ils décroissent vers : , , , . C'est exactement la signature de : quand double, ce produit est multiplié par , un facteur qui tend vers par valeurs supérieures. Comparez à la colonne quadratique, dont les rapports valent tout du long, et à un coût linéaire, dont ils vaudraient exactement .
Le gain. À : comparaisons contre pour le tri par sélection, soit fois moins. Et l'écart croît avec — c'est ce que « meilleure loi » veut dire, par opposition à « meilleur coefficient ».
Le prix. Le tri fusion alloue des tableaux intermédiaires : il n'est pas en place. Et il est récursif, ce que le programme de première écarte explicitement — d'où sa présence ici et non dans le cours. Il se réécrit sans récursivité, mais le code y perd toute sa clarté.
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.