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
- L'exercice suivant avec le tuteur, sans compte : il guide pas à pas, sans donner la réponse
- 16 autres exercices corrigés dans ce chapitre, et 20 à chercher avec le tuteur
- Le podcast et la vidéo du chapitre et la correction filmée du TD : 2 minutes sans compte
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.