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.
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
```
3. Complexité. Pire cas : comparaisons → pour sélection et bulles. Indices i dans [1..N-1].
Équivalent Python (extrait).
```python
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]))
```