Modifier tri insertion pour trier par ordre décroissant
Exercice de TD · niveau 2 · NSI (première), chapitre 7 — Parcourir, trier, prouver · Les deux tris, leurs invariants, leur coût
É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.
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.