Exercice — dans l'esprit des sujets du bac
Soit le tableau T = [64, 25, 12, 22, 11] (indices 1 à 5).
- Tri par sélection. Écrire l'algorithme du tri par sélection croissante.
- Donner l'état du tableau après chaque passe.
- Combien d'échanges sont effectués au total ?
- Tri à bulles. Écrire l'algorithme du tri à bulles avec optimisation (arrêt si aucun échange lors d'une passe).
- Donner la trace complète (état après chaque passe).
- Combien de passes sont nécessaires ?
- Quelle est la complexité dans le pire cas de chacun de ces algorithmes ? Justifier.
Voir la correction commentéeAprès avoir posé votre démarche
1. Tri par sélection sur T = [64, 25, 12, 22, 11] (indices 1 à 5).
TDOL : i, j, indMin, temp : entier. Type/Nature : compteurs de passe, indice du minimum, temporaire d'échange.
DEF PROC TriSelection(var T : tableau ; N : entier)
Variables i, j, indMin, temp : entier
Début
Pour i de 1 à N-1 faire
indMin ← i
Pour j de i+1 à N faire
Si T[j] < T[indMin] alors indMin ← j FinSi
FinPour
Si indMin ≠ i alors
temp ← T[i] ; T[i] ← T[indMin] ; T[indMin] ← temp
FinSi
FinPour
Fin
Trace :
- Passe 1 : min=11 (pos 5) ↔ pos 1 →
[11, 25, 12, 22, 64] - Passe 2 : min=12 (pos 3) ↔ pos 2 →
[11, 12, 25, 22, 64] - Passe 3 : min=22 (pos 4) ↔ pos 3 →
[11, 12, 22, 25, 64] - Passe 4 : déjà ordonné sur le reste →
[11, 12, 22, 25, 64]
T contient "11, 12, 22, 25, 64" à la fin.
1.(b) Nombre d'échanges. Un échange par passe où indMin ≠ i : passes 1, 2 et 3 échangent, la passe 4 trouve le minimum déjà en place. Total : 3 échanges (contre 10 comparaisons).
2. Tri à bulles avec optimisation (arrêt si aucun échange).
DEF PROC TriBulles(var T : tableau ; N : entier)
Variables i, j, temp : entier ; echange : booléen
Début
echange ← Vrai ; i ← 1
TantQue (echange = Vrai) et (i ≤ N-1) faire
echange ← Faux
Pour j de 1 à N-i faire
Si T[j] > T[j+1] alors
temp ← T[j] ; T[j] ← T[j+1] ; T[j+1] ← temp
echange ← Vrai
FinSi
FinPour
i ← i + 1
FinTantQue
Fin
2.(a) Trace du tri à bulles sur [64, 25, 12, 22, 11] :
- Passe 1 : [25, 12, 22, 11, 64] (4 échanges, le 64 remonte en fin)
- Passe 2 : [12, 22, 11, 25, 64] (3 échanges)
- Passe 3 : [12, 11, 22, 25, 64] (1 échange)
- Passe 4 : [11, 12, 22, 25, 64] (1 échange)
- Passe 5 : aucun échange → echange = Faux, arrêt.
2.(b) Il faut 4 passes utiles plus une cinquième passe de vérification qui ne modifie rien ; sans l'optimisation, l'algorithme ferait systématiquement N-1 = 4 passes.
3. Complexité. Pire cas : comparaisons → pour sélection et bulles. Indices i dans [1..N-1].
Équivalent Python (extrait).def tri_selection(T):
N = len(T)
for i in range(N-1):
ind_min = i
for j in range(i+1, N):
if T[j] < T[ind_min]:
ind_min = j
T[i], T[ind_min] = T[ind_min], T[i]
return T
print(tri_selection([64,25,12,22,11]))