Cours
Algorithmes sur les tableaux : parcours et tris
Un algorithme est une méthode précise pour résoudre un problème, indépendante du langage.
Ce chapitre étudie les algorithmes les plus courants sur les tableaux : le parcours séquentiel (rechercher une valeur, un maximum, calculer une moyenne), puis deux algorithmes de tri, par sélection et par insertion.
Au-delà du code, on apprend trois choses : prouver qu'un algorithme est correct avec un invariant de boucle, justifier sa terminaison, et évaluer son coût.
1. Le parcours séquentiel
1.1 Rechercher une occurrence
On veut savoir si une valeur v est dans un tableau t.
On compare v à chaque case, de gauche à droite, et on s'arrête dès qu'on la trouve.
La méthode fonctionne pour des valeurs de type quelconque : nombres, chaînes, p-uplets.
1.2 Extremum et moyenne
1.3 Coût linéaire
Pour la recherche, le pire cas est la valeur absente, ou placée en dernière position : il faut comparaisons.
Pour le maximum et la moyenne, il faut ou opérations.
Comptons les comparaisons dans le pire cas, pour trois tailles de tableau.
2. Le tri par sélection
2.1 L'idée
Trier, c'est réordonner les éléments par ordre croissant.
Le tri par sélection construit la partie triée par la gauche.
Le programme affiche le tableau après chaque étape. Essaie avec d'autres tableaux.
À l'étape , le minimum est échangé avec . À l'étape , le minimum est déjà en place : rien ne bouge.
2.2 Invariant et correction
La preuve se rédige toujours en trois temps.
Initialisation. Pour , la partie t[0..-1] est vide : la propriété est vraie.
Conservation. Supposons la propriété vraie au début de l'étape .
On place en t[i] le minimum de t[i..n-1].
Par l'invariant, il est supérieur ou égal à tous les éléments de t[0..i-1]. Par construction, il est inférieur ou égal à tous ceux de t[i+1..n-1].
Donc t[0..i] est trié et inférieur ou égal au reste : la propriété est vraie au début de l'étape .
Conclusion. À la sortie de la boucle, t[0..n-2] est trié et inférieur ou égal à t[n-1] : le tableau entier est trié. L'algorithme est correct.
2.3 Terminaison et coût
Terminaison. Les deux boucles for sont bornées : le nombre de tours est fini, l'algorithme s'arrête toujours.
Coût. À l'étape , la recherche du minimum fait comparaisons.
Au total : comparaisons, quel que soit l'état initial du tableau.
3. Le tri par insertion
3.1 L'idée
C'est la méthode du joueur de cartes.
Pour insérer , il n'y a rien à décaler. Pour insérer , il faut trois décalages.
3.2 Invariant et correction
Initialisation. Pour , t[0..0] contient un seul élément : il est trié.
Conservation. La boucle while décale vers la droite les éléments de t[0..i-1] supérieurs à , qui restent dans le même ordre.
Elle place ensuite juste après le dernier élément inférieur ou égal à .
Donc t[0..i] est trié et contient les mêmes éléments.
Conclusion. À la fin, t[0..n-1] est trié.
3.3 Terminaison et coût
Terminaison. La boucle for est bornée. Dans la boucle while, j diminue de à chaque tour et la boucle s'arrête au plus tard quand j vaut : j est un variant.
Coût. Cette fois, il dépend du tableau.
| Tableau de départ | Comparaisons | Coût |
|---|---|---|
| déjà trié (meilleur cas) | une par étape : | linéaire |
| trié à l'envers (pire cas) | quadratique | |
| quelconque (en moyenne) | environ la moitié du pire cas | quadratique |
Vérifions-le en comptant les comparaisons sur éléments.
3.4 Comparer les deux tris
| Tri | Pire cas | Meilleur cas | Écritures | Atout |
|---|---|---|---|---|
| sélection | comparaisons | , toujours | au plus échanges | peu d'écritures |
| insertion | comparaisons | (déjà trié) | jusqu'à décalages | rapide sur un tableau presque trié |
Les deux tris sont quadratiques dans le pire cas : ils conviennent pour quelques milliers d'éléments.
Pour des millions d'éléments, on utilise des tris plus rapides, comme le tri fusion vu en terminale, ou la fonction sorted de Python, qui fait environ opérations.
4. Exemple résolu pas à pas
Commence par la question a, que tu peux faire vérifier.
Correction · Question a : le coût
Il y a une comparaison par élément, donc comparaisons : le coût est linéaire.
Correction · Question b
Étape : le minimum de [4, 8, 1, 6] est ( comparaisons).
Après l'échange : [1, 8, 4, 6].
Étape : le minimum de [8, 4, 6] est ( comparaisons) : [1, 4, 8, 6].
Étape : le minimum de [8, 6] est ( comparaison) : [1, 4, 6, 8].
Total : comparaisons, soit .
Correction · Question c
Insérer : comparaison avec , rien ne bouge.
Insérer : comparé à puis à , soit comparaisons et décalages : [1, 4, 8, 6].
Insérer : comparé à (décalage), puis à (arrêt), soit comparaisons : [1, 4, 6, 8].
Total : comparaisons contre . L'insertion profite des parties déjà ordonnées.
Correction · Question d
Invariant : au début de l'étape , t[0..i-1] est trié.
Terminaison du while : j diminue de à chaque tour et la boucle s'arrête dès que j < 0.
j est un variant : entier, strictement décroissant, minoré par .
À retenir
Révise ce chapitre avec KlarIA
Tuteur qui t'explique pas à pas, quiz pour t'entraîner, flashcards pour mémoriser. Gratuit.
Créer mon compte gratuitement→