NSI (première) · Chapitre 7 · Exercice de TD
Modifier tri insertion pour trier par ordre décroissant
Parcourir, trier, prouver · Les deux tris, leurs invariants, leur coût · niveau 2
Énoncé
Modifier tri_insertion pour trier par ordre décroissant. Une seule modification suffit : laquelle ? L'invariant change-t-il ?
Corrigé
Un seul caractère. Le > de la condition devient < :
def tri_insertion_decroissant(t):
"""Trie t par ordre DÉCROISSANT, sur place."""
for i in range(1, len(t)):
x = t[i]
j = i
while j > 0 and t[j - 1] < x: # SEULE modification : > devient <
t[j] = t[j - 1]
j = j - 1
t[j] = x
tri_insertion_decroissant([5, 2, 8, 1]) rend [8, 5, 2, 1]. Validation : comparée à sorted(t, reverse=True) sur tableaux tirés au hasard, doublons compris — cas passent.
L'invariant change, mais d'un mot. Il devient : avant le tour , t[0..i-1] est trié par ordre décroissant et contient les mêmes éléments que les premiers du tableau initial. La structure de la démonstration — initialisation, conservation, terminaison — ne bouge pas d'une ligne ; seul le sens de la relation d'ordre est renversé.
Le variant, lui, ne change pas du tout. C'est toujours j, entier, positif, strictement décroissant. La terminaison ne dépend pas du sens du tri : elle ne dépend que de la façon dont j évolue.
Ce que cet exercice enseigne. Un invariant bien écrit se transporte. Il est paramétré par la relation d'ordre, et changer la relation ne demande pas de tout redémontrer. C'est un critère de qualité : un invariant qu'il faudrait réécrire entièrement pour une variante aussi mince était sans doute trop lié au code et pas assez à l'idée.
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.