Pourquoi la boucle externe de tri selection s'arrête-t-elle à n - 1 et…
Application directe du cours · niveau 2 · NSI (première), chapitre 7 — Parcourir, trier, prouver · Dérouler, compter, vérifier
Énoncé
Pourquoi la boucle externe de tri_selection s'arrête-t-elle à n - 1 et non à n ? Que se passerait-il avec n — erreur, ou simple travail inutile ?
Corrigé
Pourquoi suffit. C'est la troisième étape de la démonstration du cours. À la sortie, t[0..n-2] est trié et contient les plus petits éléments ; le seul élément restant est donc le plus grand, et la seule case restante est la dernière. Il y est déjà. Il n'y a rien à faire.
Avec n : du travail inutile, et rien d'autre. Au tour , la boucle interne est range(n, n) — vide. Aucune comparaison n'est faite, m reste égal à , et l'échange t[n-1], t[n-1] = t[n-1], t[n-1] ne change rien.
| comparaisons, boucle à | boucle à | |
|---|---|---|
Exactement le même nombre de comparaisons — et les deux versions rendent le même tableau, vérifié sur tirages. Le coût supplémentaire est d'un tour de boucle et d'un échange nul : invisible.
Ce qui serait, en revanche, une vraie erreur. Écrire range(n + 1) : au tour , l'accès t[n] lèverait une IndexError. Et le cas mérite un regard : range(-1) est vide, donc le tri d'un tableau vide ne fait rien — ce qui est juste.
La conclusion à retenir. Écrire n'est pas une optimisation : c'est ce que la démonstration dit. Une borne de boucle qu'on ne sait pas justifier est une borne qu'on a devinée — et un jour on devinera mal.
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.