Mathématiques · 2nde

Algorithmes de recherche et tri simple

Pas de panique, on va tout reprendre depuis le début. Pour comprendre les algorithmes de recherche et de tri, tu as juste besoin de savoir ce qu'est une liste, une variable, une boucle et une condition. Si ces mots te disent quelque chose, on est sur la bonne voie. On va les réactiver ensemble et construire directement les deux premiers algorithmes. Tu vas voir, c'est plus simple que ça en a l'air.

Les prérequis indispensables

Avant de plonger dans les algorithmes, on remet en place les briques de base que tout programme utilise.

Une variable : c'est comme une boîte qui porte un nom et qui contient une valeur (un nombre, un mot, vrai/faux...). On peut lire ce qu'il y a dedans, et on peut changer son contenu. Exemple : max ← 7 signifie qu'on met la valeur 7 dans la boîte nommée max.

Une liste : c'est une collection d'éléments rangés dans un ordre précis. Chaque élément a une position, qu'on appelle son indice. En pseudo-code, les indices commencent à 1. Par exemple, dans la liste L = [7, 2, 9], l'élément à l'indice 1 est 7, à l'indice 2 c'est 2, à l'indice 3 c'est 9.

Une boucle : c'est une structure qui répète un bloc d'instructions plusieurs fois. La boucle Pour i allant de 2 à n signifie qu'on va exécuter le bloc pour i = 2, puis i = 3, ..., jusqu'à i = n. La boucle Tant que répète tant qu'une condition est vraie.

Une conditionnelle : c'est un test qui permet de choisir entre deux actions. Si condition alors instruction exécute l'instruction seulement si la condition est vraie.

Une variable : une boîte nomméemax7max ← 7 (on range 7 dans la boîte max)Une liste : des cases numérotées par leur indice38151234← indicesL[2] = 8

Recherche du maximum : l'essentiel

On a une liste de nombres. On veut trouver le plus grand. L'idée est simple : on prend le premier comme champion provisoire, puis on le compare à chacun des suivants. Dès qu'on en trouve un plus grand, il devient le nouveau champion. À la fin, le champion est le maximum de toute la liste.

Pseudo-code :

max ← L[1]
Pour i allant de 2 à n :
    Si L[i] > max alors
        max ← L[i]
Retourner max

Le nombre de comparaisons est toujours exactement n - 1, car on compare chaque élément (sauf le premier) au maximum courant.

Recherche d'un élément : l'essentiel

On veut savoir si une valeur précise est présente dans la liste. On parcourt la liste du début à la fin. Dès qu'on trouve la valeur, on peut s'arrêter et dire qu'elle est là. Si on arrive au bout sans l'avoir trouvée, elle n'y est pas.

Pseudo-code :

trouvé ← Faux
Pour i allant de 1 à n :
    Si L[i] = valeur alors
        trouvé ← Vrai
Retourner trouvé

Le nombre de comparaisons dépend de la position de l'élément cherché. Meilleur cas : 1 comparaison (l'élément est au début). Pire cas : n comparaisons (l'élément est absent ou tout à la fin).

À toi de jouer

1. Complète la trace de l'algorithme de recherche du maximum pour la liste $L = [3, 8, 1, 5]$. On le fait ensemble : initialement, $max = \underline{\hspace{1.1em}}$. Pour $i = 2$, $L[2] = \underline{\hspace{1.1em}}$. Est-ce que $\underline{\hspace{1.1em}} > \underline{\hspace{1.1em}}$ ? Oui, donc $max$ devient $\underline{\hspace{1.1em}}$. Pour $i = 3$, $L[3] = \underline{\hspace{1.1em}}$. Est-ce que $\underline{\hspace{1.1em}} > \underline{\hspace{1.1em}}$ ? Non, donc $max$ reste $\underline{\hspace{1.1em}}$. Pour $i = 4$, $L[4] = \underline{\hspace{1.1em}}$. Est-ce que $\underline{\hspace{1.1em}} > \underline{\hspace{1.1em}}$ ? Non, donc $max$ reste $\underline{\hspace{1.1em}}$. L'algorithme renvoie $\underline{\hspace{1.1em}}$.
Corrigé
Initialement, $max = 3$. Pour $i = 2$, $L[2] = 8$. Est-ce que $8 > 3$ ? Oui, donc $max$ devient $8$. Pour $i = 3$, $L[3] = 1$. Est-ce que $1 > 8$ ? Non, donc $max$ reste $8$. Pour $i = 4$, $L[4] = 5$. Est-ce que $5 > 8$ ? Non, donc $max$ reste $8$. L'algorithme renvoie $8$.
2. On applique l'algorithme de recherche d'un élément à la liste $L = [4, 9, 2, 6]$. On cherche la valeur $2$. Complète la trace : $trouvé$ est initialisé à $\underline{\hspace{1.1em}}$. Pour $i = 1$, $L[1] = \underline{\hspace{1.1em}}$, est-ce que $\underline{\hspace{1.1em}} = 2$ ? Non. Pour $i = 2$, $L[2] = \underline{\hspace{1.1em}}$, est-ce que $\underline{\hspace{1.1em}} = 2$ ? Non. Pour $i = 3$, $L[3] = \underline{\hspace{1.1em}}$, est-ce que $\underline{\hspace{1.1em}} = 2$ ? Oui, donc $trouvé$ devient $\underline{\hspace{1.1em}}$. L'algorithme renvoie $\underline{\hspace{1.1em}}$. Combien de comparaisons ont été effectuées ? $\underline{\hspace{1.1em}}$.
Corrigé
On cherche la valeur $2$. $trouvé$ est initialisé à Faux. Pour $i = 1$, $L[1] = 4$, est-ce que $4 = 2$ ? Non. Pour $i = 2$, $L[2] = 9$, est-ce que $9 = 2$ ? Non. Pour $i = 3$, $L[3] = 2$, est-ce que $2 = 2$ ? Oui, donc $trouvé$ devient Vrai. L'algorithme renvoie Vrai. Combien de comparaisons ont été effectuées ? 3.
3. On a une liste de $n$ éléments. L'algorithme de recherche du maximum effectue toujours le même nombre de comparaisons, quel que soit le contenu de la liste. Ce nombre est : $\underline{\hspace{1.1em}}$. (Indice : regarde combien de fois on fait le test dans la boucle Pour.)
Corrigé
L'algorithme de recherche du maximum effectue toujours $n - 1$ comparaisons. En effet, la boucle commence à $i = 2$ et va jusqu'à $i = n$, ce qui fait exactement $n - 1$ tours, donc $n - 1$ comparaisons.

Ah oui, c'est ça ! On se souvient : une variable pour stocker le maximum, une boucle pour parcourir la liste, une condition pour comparer. Maintenant on va structurer tout ça avec une vraie méthode pas-à-pas, et on ajoute le tri par sélection, qui est un peu le prolongement naturel de la recherche du minimum. Prêt à remettre de l'ordre dans tout ça ?

Méthode pas-à-pas : recherche du maximum

Pour appliquer l'algorithme de recherche du maximum à une liste $L$ de $n$ éléments :

  1. Initialiser la variable $max$ avec le premier élément : $max \leftarrow L[1]$.
  2. Parcourir les indices $i$ de 2 à $n$ avec une boucle Pour.
  3. Pour chaque $i$, comparer $L[i]$ et $max$ : si $L[i] > max$, alors mettre à jour $max \leftarrow L[i]$.
  4. À la fin de la boucle, retourner $max$.

Piège à éviter : ne jamais initialiser $max$ à 0. Si tous les éléments sont négatifs, 0 serait plus grand qu'eux, et le résultat serait faux. On initialise toujours avec $L[1]$.

Méthode pas-à-pas : recherche d'un élément

Pour savoir si une valeur $v$ est dans la liste $L$ :

  1. Initialiser une variable booléenne $trouvé$ à Faux.
  2. Parcourir les indices $i$ de 1 à $n$ avec une boucle Pour.
  3. Pour chaque $i$, comparer $L[i]$ et $v$ : si $L[i] = v$, alors $trouvé \leftarrow$ Vrai.
  4. À la fin de la boucle, retourner $trouvé$.

Le nombre de comparaisons varie : 1 si l'élément est en première position, $n$ s'il est absent ou en dernière position.

Tri par sélection : principe et méthode

Le tri par sélection range une liste dans l'ordre croissant. L'idée : à chaque étape, on sélectionne le plus petit élément de la partie encore non triée, et on le place au début de cette partie.

Méthode pas-à-pas :

  1. Pour $i$ allant de 1 à $n-1$ :
    • La partie non triée est constituée des indices $i$ à $n$.
    • On cherche l'indice $i_{\min}$ du minimum dans cette partie (boucle interne sur $j$ de $i+1$ à $n$).
    • On échange $L[i]$ et $L[i_{\min}]$ (même si $i_{\min} = i$, auquel cas l'échange ne change rien).
  2. Après $n-1$ étapes, la liste est entièrement triée.

Erreur fréquente : confondre l'indice du minimum et sa valeur. $i_{\min}$ est un numéro de position, $L[i_{\min}]$ est la valeur à cette position. Pour l'échange, on utilise les indices, pas les valeurs.

Tri par sélection — une étapeéchange14937↑ minimumpartie déjà triéepartie non triéeLe minimum (3) part au début de la zone non triée.

À toi de jouer

1. On applique la recherche du maximum à la liste $L = [12, 5, 18, 3, 9]$. Complète la trace en suivant la méthode pas-à-pas. Initialisation : $max = \underline{\hspace{1.1em}}$. Boucle : pour $i = 2$, $L[2] = \underline{\hspace{1.1em}}$. Comparaison : $\underline{\hspace{1.1em}} > \underline{\hspace{1.1em}}$ ? $\underline{\hspace{1.1em}}$, donc $max$ devient $\underline{\hspace{1.1em}}$. Pour $i = 3$, $L[3] = \underline{\hspace{1.1em}}$. Comparaison : $\underline{\hspace{1.1em}} > \underline{\hspace{1.1em}}$ ? $\underline{\hspace{1.1em}}$, donc $max$ devient $\underline{\hspace{1.1em}}$. Pour $i = 4$, $L[4] = \underline{\hspace{1.1em}}$. Comparaison : $\underline{\hspace{1.1em}} > \underline{\hspace{1.1em}}$ ? Non, $max$ reste $\underline{\hspace{1.1em}}$. Pour $i = 5$, $L[5] = \underline{\hspace{1.1em}}$. Comparaison : $\underline{\hspace{1.1em}} > \underline{\hspace{1.1em}}$ ? Non, $max$ reste $\underline{\hspace{1.1em}}$. Résultat renvoyé : $\underline{\hspace{1.1em}}$.
Corrigé
Initialisation : $max = 12$. Boucle : pour $i = 2$, $L[2] = 5$. Comparaison : $5 > 12$ ? Non, donc $max$ reste 12. Pour $i = 3$, $L[3] = 18$. Comparaison : $18 > 12$ ? Oui, donc $max$ devient 18. Pour $i = 4$, $L[4] = 3$. Comparaison : $3 > 18$ ? Non, $max$ reste 18. Pour $i = 5$, $L[5] = 9$. Comparaison : $9 > 18$ ? Non, $max$ reste 18. Résultat renvoyé : 18.
2. On cherche la valeur $7$ dans la liste $L = [2, 7, 5, 1, 8]$ avec l'algorithme de recherche d'un élément. Complète la trace. Initialisation : $trouvé = \underline{\hspace{1.1em}}$. Pour $i = 1$, $L[1] = \underline{\hspace{1.1em}}$, est-ce que $\underline{\hspace{1.1em}} = 7$ ? Non. Pour $i = 2$, $L[2] = \underline{\hspace{1.1em}}$, est-ce que $\underline{\hspace{1.1em}} = 7$ ? Oui, donc $trouvé$ devient $\underline{\hspace{1.1em}}$. L'algorithme renvoie $\underline{\hspace{1.1em}}$. Nombre de comparaisons effectuées : $\underline{\hspace{1.1em}}$.
Corrigé
Initialisation : $trouvé = Faux$. Pour $i = 1$, $L[1] = 2$, est-ce que $2 = 7$ ? Non. Pour $i = 2$, $L[2] = 7$, est-ce que $7 = 7$ ? Oui, donc $trouvé$ devient Vrai. L'algorithme renvoie Vrai. Nombre de comparaisons effectuées : 2.
3. Tri par sélection : on trie la liste $L = [6, 3, 9, 2]$. Complète les étapes. Étape 1 ($i = 1$) : partie non triée = $[6, 3, 9, 2]$, minimum = $\underline{\hspace{1.1em}}$ (indice $\underline{\hspace{1.1em}}$). Échange L[1] et L[$\underline{\hspace{1.1em}}$] → $[\underline{\hspace{1.1em}}, \underline{\hspace{1.1em}}, \underline{\hspace{1.1em}}, \underline{\hspace{1.1em}}]$. Étape 2 ($i = 2$) : partie non triée = $[\underline{\hspace{1.1em}}, \underline{\hspace{1.1em}}, \underline{\hspace{1.1em}}]$, minimum = $\underline{\hspace{1.1em}}$ (indice $\underline{\hspace{1.1em}}$). Échange L[2] et L[$\underline{\hspace{1.1em}}$] → $[\underline{\hspace{1.1em}}, \underline{\hspace{1.1em}}, \underline{\hspace{1.1em}}, \underline{\hspace{1.1em}}]$. Étape 3 ($i = 3$) : partie non triée = $[\underline{\hspace{1.1em}}, \underline{\hspace{1.1em}}]$, minimum = $\underline{\hspace{1.1em}}$ (indice $\underline{\hspace{1.1em}}$). Déjà en place. Liste finale triée : $[\underline{\hspace{1.1em}}, \underline{\hspace{1.1em}}, \underline{\hspace{1.1em}}, \underline{\hspace{1.1em}}]$.
Corrigé
Étape 1 ($i = 1$) : partie non triée = $[6, 3, 9, 2]$, minimum = 2 (indice 4). Échange L[1] et L[4] → $[2, 3, 9, 6]$. Étape 2 ($i = 2$) : partie non triée = $[3, 9, 6]$, minimum = 3 (indice 2). Déjà en place → $[2, 3, 9, 6]$. Étape 3 ($i = 3$) : partie non triée = $[9, 6]$, minimum = 6 (indice 4). Échange L[3] et L[4] → $[2, 3, 6, 9]$. Liste finale triée : $[2, 3, 6, 9]$.

Maintenant, on va faire de la répétition mécanique pour que les gestes deviennent automatiques. Cinq mini-exercices quasiment identiques : tu vas appliquer la recherche du maximum, la recherche d'un élément, et le tri par sélection sur des petites listes. À la fin, tu auras les réflexes.

À toi de jouer

1. Recherche du maximum : applique l'algorithme à $L = [4, 9, 2, 7]$. Quelle est la valeur initiale de $max$ ? Quel est le maximum final ?
Corrigé
Initialisation : $max = L[1] = 4$. $i=2$ : $9 > 4$ donc $max = 9$. $i=3$ : $2 > 9$ ? Non. $i=4$ : $7 > 9$ ? Non. Maximum final : 9.
2. Recherche du maximum : applique l'algorithme à $L = [11, 3, 15, 6, 8]$. Quelle est la valeur initiale de $max$ ? Quel est le maximum final ?
Corrigé
Initialisation : $max = L[1] = 11$. $i=2$ : $3 > 11$ ? Non. $i=3$ : $15 > 11$ donc $max = 15$. $i=4$ : $6 > 15$ ? Non. $i=5$ : $8 > 15$ ? Non. Maximum final : 15.
3. Recherche d'un élément : cherche la valeur $10$ dans $L = [5, 10, 3, 8]$. Combien de comparaisons ? Que renvoie l'algorithme ?
Corrigé
$i=1$ : $5 = 10$ ? Non. $i=2$ : $10 = 10$ ? Oui, $trouvé$ devient Vrai. L'algorithme renvoie Vrai après 2 comparaisons.
4. Recherche d'un élément : cherche la valeur $7$ dans $L = [2, 4, 6, 8]$. Combien de comparaisons ? Que renvoie l'algorithme ?
Corrigé
$i=1$ : $2 = 7$ ? Non. $i=2$ : $4 = 7$ ? Non. $i=3$ : $6 = 7$ ? Non. $i=4$ : $8 = 7$ ? Non. L'algorithme renvoie Faux après 4 comparaisons (l'élément est absent).
5. Tri par sélection : applique le tri à $L = [3, 7, 1, 5]$. Donne l'état de la liste après chaque étape.
Corrigé
Étape 1 ($i=1$) : partie non triée $[3,7,1,5]$, min = 1 (indice 3). Échange L[1] et L[3] → $[1, 7, 3, 5]$. Étape 2 ($i=2$) : partie non triée $[7,3,5]$, min = 3 (indice 3). Échange L[2] et L[3] → $[1, 3, 7, 5]$. Étape 3 ($i=3$) : partie non triée $[7,5]$, min = 5 (indice 4). Échange L[3] et L[4] → $[1, 3, 5, 7]$. Trié.

On monte d'un cran. Ici, on va tracer des algorithmes plus complets, compléter des codes, et résoudre un petit problème. C'est exactement le type de questions que tu peux rencontrer en évaluation. Prends ton temps, sois méthodique, et vérifie chaque étape.

Rappel : sens direct et réciproque en algorithmique

En algorithmique de recherche, on peut voir deux directions :

  • Trouver une valeur (le maximum, un élément) : on parcourt la liste et on extrait une information. C'est le sens direct de la recherche.
  • Trier une liste : on réorganise les éléments pour qu'ils soient dans un certain ordre. C'est une opération plus lourde, qui prépare le terrain pour d'autres recherches plus efficaces (comme la recherche dichotomique, que tu verras plus tard).

Le tri par sélection est un tri simple mais coûteux en nombre de comparaisons : pour une liste de $n$ éléments, il effectue toujours $\frac{(n-1)n}{2}$ comparaisons, soit environ $n^2/2$.

À toi de jouer

1. On applique l'algorithme de recherche du maximum à la liste $L = [7, 2, 9, 4, 6, 1]$. Recopie et complète le tableau de trace : pour chaque indice $i$ de 2 à 6, indique si $max$ est mis à jour et donne la valeur courante de $max$. Quelle valeur l'algorithme renvoie-t-il ? Pour une liste de $n$ éléments, combien de comparaisons cet algorithme effectue-t-il ?
Corrigé
Initialisation : $max = 7$. $i=2$ : $2 > 7$ ? Non, $max$ reste 7. $i=3$ : $9 > 7$ ? Oui, mise à jour, $max = 9$. $i=4$ : $4 > 9$ ? Non, $max$ reste 9. $i=5$ : $6 > 9$ ? Non, $max$ reste 9. $i=6$ : $1 > 9$ ? Non, $max$ reste 9. L'algorithme renvoie 9. Pour une liste de $n$ éléments, l'algorithme effectue $n-1$ comparaisons (une par tour de boucle, de $i=2$ à $i=n$).
2. On utilise l'algorithme de recherche d'un élément sur la liste $L = [3, 8, 5, 1, 7]$. a) Chercher la valeur $5$ : combien de comparaisons sont effectuées ? Que renvoie l'algorithme ? b) Chercher la valeur $4$ : combien de comparaisons ? Que renvoie l'algorithme ? c) Dans quel cas le nombre de comparaisons est-il maximal ?
Corrigé
a) Chercher 5 : $i=1$ : $3
eq 5$. $i=2$ : $8
eq 5$. $i=3$ : $5 = 5$, donc $trouvé$ devient Vrai. 3 comparaisons. L'algorithme renvoie Vrai. b) Chercher 4 : $i=1$ : $3
eq 4$. $i=2$ : $8
eq 4$. $i=3$ : $5
eq 4$. $i=4$ : $1
eq 4$. $i=5$ : $7
eq 4$. 5 comparaisons. L'algorithme renvoie Faux. c) Le nombre de comparaisons est maximal ($n$ comparaisons) lorsque l'élément est absent de la liste ou lorsqu'il est en dernière position.
3. On trie la liste $L = [5, 2, 8, 1, 4]$ par sélection (indices 1 à 5). Donne l'état de la liste après chacune des 4 étapes du tri. Combien d'échanges effectifs ont eu lieu (échanges entre deux éléments de valeurs distinctes) ? Calcule le nombre total de comparaisons, puis vérifie avec la formule $\sum_{k=1}^{n-1} k = \dfrac{(n-1)n}{2}$.
Corrigé
Étape 1 ($i=1$) : partie non triée $[5,2,8,1,4]$, min = 1 (indice 4). Échange L[1] et L[4] → $[1, 2, 8, 5, 4]$. Étape 2 ($i=2$) : partie non triée $[2,8,5,4]$, min = 2 (indice 2). Déjà en place → $[1, 2, 8, 5, 4]$. Étape 3 ($i=3$) : partie non triée $[8,5,4]$, min = 4 (indice 5). Échange L[3] et L[5] → $[1, 2, 4, 5, 8]$. Étape 4 ($i=4$) : partie non triée $[5,8]$, min = 5 (indice 4). Déjà en place → $[1, 2, 4, 5, 8]$. Échanges effectifs : étapes 1 et 3, soit 2 échanges. Nombre total de comparaisons : à l'étape 1, on compare 4 éléments (indices 2 à 5) ; étape 2 : 3 comparaisons ; étape 3 : 2 comparaisons ; étape 4 : 1 comparaison. Total = 4+3+2+1 = 10. Vérification avec la formule : pour $n=5$, $\dfrac{(5-1)\times 5}{2} = \dfrac{4 \times 5}{2} = 10$. C'est cohérent.
4. L'algorithme ci-dessous doit renvoyer l'indice du minimum d'une liste $L$ de $n$ éléments (indices 1 à $n$). Trois cases sont manquantes (notées ___ ). i_min ← ___ Pour j allant de 2 à n : Si L[j] < ___ alors i_min ← ___ Retourner i_min Recopie l'algorithme en complétant les trois cases. Applique l'algorithme complété à $L = [6, 3, 9, 1, 5]$. Quelle valeur est renvoyée et que représente-t-elle ?
Corrigé
Algorithme complété : i_min ← 1 Pour j allant de 2 à n : Si L[j] < L[i_min] alors i_min ← j Retourner i_min Application à $L = [6, 3, 9, 1, 5]$ : Initialisation : $i_{min} = 1$. $j=2$ : $L[2]=3$, $L[i_{min}]=6$. $3 < 6$ donc $i_{min} = 2$. $j=3$ : $L[3]=9$, $L[i_{min}]=3$. $9 < 3$ ? Non. $j=4$ : $L[4]=1$, $L[i_{min}]=3$. $1 < 3$ donc $i_{min} = 4$. $j=5$ : $L[5]=5$, $L[i_{min}]=1$. $5 < 1$ ? Non. L'algorithme renvoie 4. Cette valeur est l'indice du minimum de la liste, c'est-à-dire la position du plus petit élément (1 est à l'indice 4).
5. Les notes de six élèves sont : $L = [12, 17, 8, 14, 11, 19]$. a) Applique l'algorithme de recherche du maximum pour déterminer la meilleure note. b) Applique le tri par sélection et donne l'état de la liste après chaque étape. c) Quelle unique modification faut-il apporter à l'algorithme de tri par sélection pour trier dans l'ordre décroissant ?
Corrigé
a) Recherche du maximum : $max = 12$. $i=2$ : $17 > 12$ → $max = 17$. $i=3$ : $8 > 17$ ? Non. $i=4$ : $14 > 17$ ? Non. $i=5$ : $11 > 17$ ? Non. $i=6$ : $19 > 17$ → $max = 19$. Meilleure note : 19. b) Tri par sélection : Étape 1 : partie non triée $[12,17,8,14,11,19]$, min = 8 (indice 3). Échange L[1] et L[3] → $[8, 17, 12, 14, 11, 19]$. Étape 2 : partie non triée $[17,12,14,11,19]$, min = 11 (indice 5). Échange L[2] et L[5] → $[8, 11, 12, 14, 17, 19]$. Étape 3 : partie non triée $[12,14,17,19]$, min = 12 (indice 3). Déjà en place → $[8, 11, 12, 14, 17, 19]$. Étape 4 : partie non triée $[14,17,19]$, min = 14 (indice 4). Déjà en place → $[8, 11, 12, 14, 17, 19]$. Étape 5 : partie non triée $[17,19]$, min = 17 (indice 5). Déjà en place → $[8, 11, 12, 14, 17, 19]$. c) Pour trier dans l'ordre décroissant, il faut remplacer la recherche du minimum par la recherche du maximum dans la partie non triée. Autrement dit, au lieu de chercher le plus petit élément, on cherche le plus grand, et on le place au début de la partie non triée.

Tu maîtrises la recherche linéaire et le tri par sélection. L'an prochain, tu découvriras que chercher un élément dans une liste déjà triée peut être bien plus rapide avec la recherche dichotomique. On va aussi effleurer la notion de complexité algorithmique, qui permet de comparer l'efficacité des algorithmes entre eux. Prêt à voir plus loin ?

Complexité : un aperçu

La complexité d'un algorithme mesure son efficacité en temps (ou en mémoire) quand la taille des données augmente. On l'exprime souvent en fonction de $n$, le nombre d'éléments.

  • Recherche du maximum : $n-1$ comparaisons, soit une complexité linéaire (proportionnelle à $n$).
  • Recherche d'un élément : entre 1 et $n$ comparaisons, complexité linéaire en pire cas.
  • Tri par sélection : environ $n^2/2$ comparaisons, soit une complexité quadratique (proportionnelle à $n^2$). Pour $n=1000$, cela fait environ 500 000 comparaisons.

Quand on double la taille de la liste, un algorithme linéaire prend environ 2 fois plus de temps ; un algorithme quadratique prend environ 4 fois plus de temps. C'est pour cela que pour de grandes listes, on préfère des algorithmes de tri plus rapides (comme le tri fusion, que tu verras en 1ère).

n (taille de la liste)nombre de comparaisonstri par sélection ~ n²/2recherche ~ n0

Recherche dichotomique : l'idée

Quand une liste est triée, on peut chercher un élément beaucoup plus vite. Au lieu de parcourir du début à la fin, on compare l'élément cherché avec le milieu de la liste. S'il est plus petit, on cherche dans la moitié gauche ; s'il est plus grand, dans la moitié droite. On répète jusqu'à trouver ou jusqu'à ce que la zone de recherche soit vide.

Cet algorithme s'appelle la recherche dichotomique (du grec "dichotomia", couper en deux). Sa complexité est logarithmique : pour une liste de $n$ éléments, il faut environ $\log_2(n)$ comparaisons. Pour $n=1000$, $\log_2(1000) \approx 10$ comparaisons, contre 1000 en recherche linéaire. C'est colossal !

Recherche dichotomique (liste triée)milieu25812182430si cherché < milieu→ moitié gauchesi cherché > milieu→ moitié droiteOn compare au milieu puis on ne garde qu’une moitié.

À toi de jouer

1. On considère le tri par sélection. Pour une liste de 10 éléments, combien de comparaisons effectue-t-il ? Même question pour une liste de 100 éléments. Si on double la taille de la liste (de 100 à 200), par combien le nombre de comparaisons est-il multiplié environ ?
Corrigé
Pour $n=10$ : nombre de comparaisons = $9+8+7+6+5+4+3+2+1 = \dfrac{9 \times 10}{2} = 45$. Pour $n=100$ : nombre de comparaisons = $\dfrac{99 \times 100}{2} = 4950$. Si on double la taille : $n=200$, nombre de comparaisons = $\dfrac{199 \times 200}{2} = 19900$. Rapport : $\dfrac{19900}{4950} \approx 4,02$. Le nombre de comparaisons est multiplié par environ 4 quand la taille double. C'est la signature d'une complexité quadratique.
2. On dispose d'une liste triée de 15 nombres : $L = [2, 5, 7, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42]$. On cherche la valeur 27 avec la méthode de recherche dichotomique. Décris les étapes : à chaque tour, donne l'indice du milieu testé, la valeur à cet indice, et la nouvelle zone de recherche (indices de début et de fin). Combien de comparaisons sont nécessaires ?
Étape 1 — zone [1;15], milieu i=8 : L[8]=21 ; 27 > 21 → moitié droite [9;15]12345678910111213141525791215182124273033363942Étape 2 — zone [9;15], milieu i=12 : L[12]=33 ; 27 < 33 → moitié gauche [9;11]25791215182124273033363942Étape 3 — zone [9;11], milieu i=10 : L[10]=27 → valeur trouvée !25791215182124273033363942✓ trouvé
Corrigé
Étape 1 : zone de recherche = indices 1 à 15. Milieu = indice 8. $L[8] = 21$. $27 > 21$, donc on cherche dans la moitié droite : indices 9 à 15. Étape 2 : zone = indices 9 à 15. Milieu = indice 12. $L[12] = 33$. $27 < 33$, donc on cherche dans la moitié gauche : indices 9 à 11. Étape 3 : zone = indices 9 à 11. Milieu = indice 10. $L[10] = 27$. $27 = 27$, trouvé ! Nombre de comparaisons : 3. Pour une liste de 15 éléments, la recherche linéaire aurait nécessité 10 comparaisons (27 est à l'indice 10). La recherche dichotomique est bien plus rapide.
3. Imagine un algorithme qui, pour une liste de $n$ éléments, effectue $n^3$ comparaisons. Si $n=10$, combien de comparaisons ? Si $n$ passe à 100, par combien le nombre de comparaisons est-il multiplié ? Compare avec le tri par sélection ($n^2/2$) : lequel est le plus efficace pour $n=100$ ?
Corrigé
Pour $n=10$ : $n^3 = 10^3 = 1000$ comparaisons. Pour $n=100$ : $n^3 = 100^3 = 1\,000\,000$ comparaisons. Rapport : $\dfrac{1\,000\,000}{1000} = 1000$. Quand $n$ est multiplié par 10, le nombre de comparaisons est multiplié par 1000 (car $10^3 = 1000$). Pour le tri par sélection avec $n=100$ : $4950$ comparaisons. Comparaison : $4950$ (tri par sélection) contre $1\,000\,000$ (algorithme en $n^3$). Le tri par sélection est bien plus efficace. Plus la puissance est grande, plus l'algorithme devient lent quand $n$ augmente.
Besoin d'aide ? Nous contacter
Dans la même catégorie : Colinéarité et déterminant · Développer et factoriser · Ensembles de nombres · Fonctions de référence · Généralités sur les fonctions · Intervalles et valeur absolue

Fiche gratuite créée par Vidyalaya, association d'éducation populaire — soutien scolaire, FLE & DELF, libre et gratuit pour tous.
Tu bloques encore ? Écris-nous, on t'aide gratuitement : contact@vidyalaya.fr.

Fiche librement réutilisable sous licence CC BY-SA 4.0 — copiez, imprimez, adaptez, en citant Vidyalaya et en conservant la même licence.