Adloun

É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 fusionrapport
---

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.