Parcours et tris
Rechercher, calculer un extremum ou une moyenne ; trier par sélection et insertion, expliquer les invariants et comparer les coûts.
Environ 35 minutes
- Écrire un parcours de tableau
- Décrire les tris par sélection et insertion
- Justifier correction et terminaison
- Distinguer coûts linéaire et quadratique
Pourquoi deux programmes qui trient correctement peuvent-ils demander des efforts différents ?
Un tableau permet de ranger des données, mais son ordre initial ne répond pas toujours au besoin. Avant de trier, il faut savoir si un simple parcours suffit pour rechercher une valeur, calculer une moyenne ou trouver un minimum. Nous comparerons ensuite deux tris classiques. La trace sur un petit tableau rend leur mécanisme visible ; le raisonnement par invariant et l’étude du coût expliquent ce qui reste vrai lorsque la taille augmente.
1. Examiner les cases une à une
Un parcours séquentiel examine les éléments d’un tableau dans un ordre déterminé. Pour rechercher une occurrence de x, on compare x à chaque valeur jusqu’à trouver une égalité ou atteindre la fin. La spécification peut demander un booléen, un indice ou toutes les positions : ces résultats ne sont pas équivalents. Si on renvoie un indice particulier pour l’absence, il faut l’annoncer. Le nombre de comparaisons dépend de la position trouvée ; dans le pire cas, n cases doivent être examinées.
Pour un minimum, on suppose le tableau non vide et on initialise le meilleur candidat avec la première valeur. Chaque case suivante est comparée au candidat ; une valeur plus petite le remplace. Initialiser à 0 serait faux pour un tableau composé seulement de nombres positifs. Pour une somme, on initialise au contraire un total à 0, valeur neutre de l’addition. Une moyenne exige ensuite de diviser par l’effectif, ce qui impose un tableau non vide.
Exemple résolu
Sur t = [6, 4, 7, 2, 5], recherche le minimum puis calcule la moyenne. Donne la trace et le coût en comparaisons du minimum.
- Étape 1 : Le candidat initial vaut 6. La comparaison avec 4 le remplace par 4 ; 7 ne le change pas ; 2 le remplace par 2 ; 5 ne le change pas.
- Étape 2 : Le minimum vaut 2 après quatre comparaisons, soit n − 1 pour cinq valeurs. Après chaque étape, le candidat est le minimum des valeurs déjà vues.
- Étape 3 : La somme vaut 6 + 4 + 7 + 2 + 5 = 24. La moyenne est 24 / 5 = 4,8 ; elle ne coïncide pas nécessairement avec une valeur du tableau.
Résultat : Le minimum est 2 et la moyenne 4,8. Les deux calculs s’effectuent par des parcours de coût linéaire.
Piège à éviter : Initialiser le minimum à 0 donnerait 0, qui n’appartient pas au tableau et n’en est pas le minimum.
À toi d'essayer
On recherche la première occurrence de 9 dans [4, 9, 2, 9]. Quel indice doit être renvoyé ? Combien de comparaisons suffisent si l’on s’arrête dès la première égalité ?
Voir la réponseMasquer la réponse
Il faut renvoyer l’indice 1. Deux comparaisons suffisent : avec 4, puis avec 9. Continuer jusqu’à la fin et remplacer l’indice à chaque égalité renverrait la dernière occurrence, à l’indice 3, ce qui ne respecterait pas la demande.
2. Trier par sélection
Le tri par sélection construit un préfixe définitivement rangé. À l’étape i, il cherche l’indice du plus petit élément dans la partie allant de i à n − 1, puis échange cet élément avec t[i]. La recherche du minimum porte sur toute la partie encore non traitée, même si le candidat change plusieurs fois. Après l’échange, la case i contient la valeur attendue dans l’ordre croissant. L’échange conserve les valeurs du tableau ; il change seulement leurs positions.
Algorithme du tri par sélection
- Pour chaque indice i de 0 à n − 2, initialiser p à i : p désigne le candidat minimum de la partie restante.
- Pour chaque indice j de i + 1 à n − 1, si t[j] < t[p], affecter j à p.
- Après cette recherche, échanger t[i] et t[p]. En Python, l’échange s’écrit t[i], t[p] = t[p], t[i].
- À la fin des étapes, le tableau est trié sur place ; le tableau vide ou de longueur 1 ne demande aucun échange.
Exemple résolu
Termine le tri par sélection du tableau [6, 4, 7, 2, 5] et explique pourquoi le préfixe obtenu ne sera plus déplacé.
- Étape 1 : À i = 0, le minimum 2 échange sa place avec 6 : [2, 4, 7, 6, 5]. À i = 1, le minimum restant est déjà 4 ; le tableau ne change pas.
- Étape 2 : À i = 2, le minimum de [7, 6, 5] est 5 : l’échange donne [2, 4, 5, 6, 7]. À i = 3, le minimum de [6, 7] est déjà 6.
- Étape 3 : Chaque étape choisit le minimum de toutes les valeurs encore disponibles. Le préfixe est trié et chacune de ses valeurs est inférieure ou égale à celles de la partie restante.
Résultat : Le tableau final est [2, 4, 5, 6, 7]. Les cinq valeurs initiales sont conservées.
Piège à éviter : Échanger dès qu’on voit une valeur plus petite ne décrit plus cette version du tri par sélection : ici l’échange se fait après la recherche complète du minimum.
L’invariant de la boucle externe décrit le préfixe avant l’étape i : il est trié, contient les i plus petites valeurs avec leurs répétitions et ne dépasse aucune valeur restante. Il est vrai au départ pour le préfixe vide. Le choix du minimum préserve cette propriété en ajoutant une valeur. Quand les étapes se terminent, il ne reste qu’une case et tout le tableau est rangé. Les boucles for parcourent des ensembles finis d’indices : la terminaison est assurée.
À toi d'essayer
Le tableau [1, 2, 3, 4] est déjà trié. Combien de comparaisons entre valeurs effectue cette version du tri par sélection ? Explique pourquoi les échanges inutiles ne changent pas ce nombre.
Correction détaillée pas à pasDans ce chapitre : 2 corrections détaillées.
3. Trier par insertion
Le tri par insertion maintient lui aussi un préfixe trié, mais il l’agrandit différemment. À l’étape i, on mémorise la valeur v = t[i]. On décale vers la droite les valeurs du préfixe qui sont strictement supérieures à v, puis on place v dans l’emplacement libéré. Il ne faut pas perdre v pendant les décalages : le tableau peut contenir momentanément des valeurs répétées, mais la valeur à insérer reste conservée dans une variable.
Algorithme du tri par insertion
- Pour chaque indice i de 1 à n − 1, mémoriser v = t[i] et initialiser j à i − 1.
- Tant que j ≥ 0 et que t[j] > v, copier t[j] dans t[j + 1], puis diminuer j de 1.
- Quand le test devient faux, placer v dans t[j + 1]. Le préfixe allant de 0 à i est alors trié.
- En Python, l’ordre de la condition j >= 0 and t[j] > v permet de vérifier la borne avant de lire la case visée.
Exemple résolu
Insère 4 dans le préfixe trié de [2, 6, 7, 4, 5], puis termine le tri. Justifie l’arrêt de la boucle de décalage.
- Étape 1 : À i = 3, mémoriser v = 4. Comme 7 > 4, déplacer 7 d’une case à droite ; comme 6 > 4, déplacer aussi 6. La valeur 2 n’est pas supérieure à 4.
- Étape 2 : La recherche de la place s’arrête à j = 0 ; placer 4 à j + 1 donne [2, 4, 6, 7, 5].
- Étape 3 : À i = 4, mémoriser 5. Décaler 7 puis 6 ; s’arrêter devant 4 et placer 5 après lui. On obtient [2, 4, 5, 6, 7].
Résultat : À chaque étape, le préfixe agrandi est trié. Dans la boucle interne, j diminue et le nombre de positions encore à examiner décroît jusqu’à l’arrêt.
Piège à éviter : Placer la valeur en t[j] au lieu de t[j + 1] écraserait la dernière valeur qui doit rester avant elle.
Pour justifier la correction, on annonce que le préfixe avant i est trié et contient les mêmes valeurs que le préfixe initial correspondant. Les décalages déplacent sans perdre les valeurs supérieures à v ; l’insertion de v les remet dans l’ordre avec les autres. Le préfixe s’agrandit donc d’une case en préservant cette propriété. La boucle externe est bornée ; la boucle interne termine car j diminue et ne peut pas continuer après être devenu négatif.
4. Comparer les coûts et réutiliser les tris
Un coût algorithmique compte une opération choisie en fonction de la taille n, plutôt que le temps d’une seule mesure sur un ordinateur. Le parcours séquentiel a un coût linéaire : au plus un nombre proportionnel à n d’examens. Le tri par sélection effectue (n − 1) + (n − 2) + … + 1 comparaisons, soit n(n − 1)/2. Le terme dominant est proportionnel à n² : le coût est quadratique. Doubler n fait approcher le nombre de comparaisons d’un facteur quatre lorsque n devient grand.
Pour l’insertion, le pire cas est notamment un tableau strictement décroissant : chaque nouvelle valeur traverse tout le préfixe. Le nombre de comparaisons de valeurs atteint aussi n(n − 1)/2. Sur un tableau déjà trié, une comparaison de valeurs par étape suffit dans cette version, donc n − 1 au total. Il faut annoncer le cas étudié et l’opération comptée. Les tests d’indices et les affectations donnent d’autres comptes exacts, sans changer ici les ordres de grandeur du pire cas.
Ces outils peuvent aussi servir à une classification par les k plus proches voisins. On calcule une distance entre un objet à classer et les exemples connus, on trie selon cette distance, puis on choisit la classe majoritaire parmi les k premiers. Il faut annoncer la distance, k et la règle de départage. Avec k = 3 et les classes voisines A, B, A, la prédiction est A. Cette prédiction dépend des exemples et de la mesure de proximité ; elle ne constitue pas une preuve que la classe réelle est A.
À toi d'essayer
Pour une classification, les cinq voisins classés par distance ont les classes B, A, A, B, B. Donne la prédiction avec k = 3 puis k = 5. Que montre cette différence ?
Correction détaillée pas à pasDans ce chapitre : 2 corrections détaillées.
5. Passer de la trace à la justification
Au bac : expliquer un parcours ou un tri
- Préciser le résultat voulu et les cas admis, notamment tableau vide et valeurs répétées.
- Donner la trace des étapes avec les indices, les déplacements et la valeur mémorisée.
- Énoncer un invariant, vérifier son initialisation, sa conservation et ce qu’il donne à la fin.
- Justifier la terminaison, puis compter une opération dans un cas clairement annoncé. Ces raisonnements préparent la poursuite de NSI en terminale.
Erreurs fréquentes : trier pour un simple minimum alors qu’un parcours suffit ; oublier la précondition non vide d’une moyenne ; perdre la valeur insérée ; confondre un tableau qui paraît rangé et une preuve ; annoncer un coût sans préciser le cas.
Vocabulaire
- Invariant :
- Propriété vraie à un point donné avant et après chaque tour de boucle.
- Préfixe :
- Partie initiale d’un tableau.
- Coût linéaire :
- Coût dont l’ordre de grandeur est proportionnel à la taille.
- Coût quadratique :
- Coût dont l’ordre de grandeur est proportionnel au carré de la taille.
Bilan
| Question | Repère |
|---|---|
| Parcours | Une inspection organisée suffit souvent. |
| Sélection | Choisir le minimum restant puis échanger. |
| Insertion | Décaler un préfixe trié pour y placer la valeur suivante. |
Retrouve S’entraîner à l’adresse /exercices. Compare les deux tris sur un tableau déjà rangé, un tableau inversé et un tableau comportant des répétitions.
À retenir
- Un minimum peut se calculer en n − 1 comparaisons pour n valeurs non vides.
- La sélection fixe successivement les plus petites valeurs.
- L’insertion agrandit un préfixe trié par décalages.
- Les deux tris ont un coût quadratique dans le pire cas.
- Les tests sur des exemples complètent la preuve par invariant et terminaison.
Fiche de révision
Pour une recherche
annoncer première occurrence, présence ou toutes les positions.
Pour la sélection
minimum du suffixe, échange, préfixe définitivement fixé.
Pour l’insertion
sauvegarder, décaler les plus grands, insérer à j + 1.
Pour le coût
choisir l’opération, la taille et le cas avant de compter.
Et maintenant ?
Tu as lu le cours. L’étape suivante tient en une action.
Relis le coursLes exercices de ce chapitre arrivent bientôt.Prolonge l’expérience !
Continue à explorer ce chapitre à travers de nouvelles activités, des défis et des expériences interactives. Avec Premium, l’apprentissage continue !
Ici, tu débloques aussi 2 corrections détaillées.
Parent ? Suivez les progrès de votre enfant.
