Adloun

Le tri par sélection est-il stable

Exercice de TD · niveau 3 (difficile) · NSI (première), chapitre 7 — Parcourir, trier, prouver · Les deux tris, leurs invariants, leur coût

Énoncé

Le tri par sélection est-il stable ? Chercher un contre-exemple par force brute — le plus court possible — puis écrire une variante stable, et dire ce qu'elle coûte.

Corrigé

Il ne l'est pas. Le contre-exemple le plus court se trouve en essayant tous les tableaux de longueur croissante sur deux valeurs seulement :


t = [(1, 0), (1, 1), (0, 2)]        # (valeur, rang d'arrivée)
tri_selection_cle(t)                # trie sur la première composante
# obtenu : [(0, 2), (1, 1), (1, 0)]
# stable  : [(0, 2), (1, 0), (1, 1)]

Trois éléments, deux valeurs distinctes : on ne peut pas faire plus court. Les rangs et sont sortis dans l'ordre inverse.

Pourquoi. C'est l'échange qui est en cause. Au tour , le minimum est le final ; l'échanger avec la case y envoie le qui s'y trouvait — d'un bond, par-dessus le . Un échange déplace deux éléments, dont un qui n'avait rien demandé, et il peut le faire sauter par-dessus ses ex æquo.

La variante stable. On remplace l'échange par un décalage du bloc : l'élu remonte d'une case à la fois, et les autres glissent d'un cran sans se dépasser.


def tri_selection_stable(t):
    """Tri par sélection stable : décalage au lieu d'échange."""
    n = len(t)
    for i in range(n - 1):
        m = i
        for j in range(i + 1, n):
            if t[j][0] < t[m][0]:
                m = j
        x = t[m]
        for k in range(m, i, -1):      # le bloc glisse d'un cran
            t[k] = t[k - 1]
        t[i] = x

Sur le contre-exemple : [(0, 2), (1, 0), (1, 1)] — l'ordre d'arrivée est respecté. Validation : comparée à sorted(t, key=...), qui est stable, sur tableaux tirés au hasard — cas passent.

Le prix. Les comparaisons ne changent pas : toujours . Mais les écritures passent de échanges — soit affectations — à un décalage qui peut faire écritures par tour, donc jusqu'à en tout. On a acheté la stabilité avec des écritures, et sur une mémoire où écrire coûte cher, le marché n'est pas toujours bon. C'est exactement le compromis qui fait qu'en pratique on préfère le tri par insertion, stable sans rien payer de plus.

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.