Adloun

NSI (première) · Chapitre 7 · Exercice de TD

Le tri par sélection est-il stable

Parcourir, trier, prouver · Les deux tris, leurs invariants, leur coût · niveau 3 (difficile)

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

100 % gratuit

Essaie le suivant avec le tuteur

Faire l'exercice suivant avec le tuteur

Sans compte : le cours, 2 minutes de podcast et de vidéo et un exercice avec le tuteur. Pour tout le reste : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant avec le tuteur →