Trier par sélection
- Fiche de cours
- Quiz
- Profs en ligne
- Videos
- Application mobile
- Écrire un algorithme de tri par sélection d’un tableau de nombres.
- Prouver la terminaison et la correction du tri par sélection.
- Montrer que le cout du tri par sélection est quadratique.
- Coder en Python l’algorithme de tri par sélection d’un tableau de nombres.
- Le tri par sélection d’un tableau consiste rechercher le plus petit élément et à le placer en 0, le second plus petit élément et à le placer en 1, etc.
- Le cout d’un tri par sélection est toujours quadratique.
- Utiliser des boucles (for et while).
- Algorithmes de recherche : rechercher un extremum (terminaison, correction et cout).
Ainsi, à l’étape k, les k−1 premiers éléments du tableau sont triés et sont inférieurs aux autres éléments du tableau. On place ensuite le plus petit des éléments qui restent au rang k.
Voici les étapes du tri par sélection de Tab=[2, 3, 1, 6, 4, 5].
Étape | Tab | Commentaire |
1 | [1, 3, 2, 6, 4, 5] | Parmi [2, 3, 1, 6, 4, 5], 1 est le plus petit élément. On échange 1 et 2. |
2 | [1, 2, 3, 6, 4, 5] | Parmi [3, 2, 6, 4, 5], 2 est le plus petit élément. On échange 2 et 3. |
3 | [1, 2, 3, 6, 4, 5] | Parmi [3, 6, 4, 5], 3 est le plus petit élément. 3 est déjà à sa place. |
4 | [1, 2, 3, 4, 6, 5] | Parmi [6, 4, 5], 4 est le plus petit élément. On échange 4 et 6. |
5 | [1, 2, 3, 4, 5, 6] | Parmi [6, 5], 5 est le plus petit élément. On échange 5 et 6. |
6 | [1, 2, 3, 4, 5, 6] | 6 est à sa place. |
Voici ci-dessous un algorithme du tri par sélection d’un tableau de nombres Tab de taille n.
Pour i allant de 0 à n−2 | i = 0, puis i = 1, puis… i = n−2, |
i_mini ← i | on affecte à la variable i_mini l’indice i. C’est i_mini qui va contenir l’indice du plus petit élément après le parcours. |
Pour j allant de i+1 à n−1 | j = i+1, puis j = i+2, puis… j = n−1, |
Si Tab[j] < Tab[i_mini] | si Tab[j] est plus petit que Tab[i_mini], |
i_mini ← j | alors on affecte j à i_mini. |
FinSi | Fin de l’instruction conditionnelle. |
échanger Tab[i] et Tab[i_mini] | On échange Tab[i] et Tab[i_mini]. |
FinPour | Fin de la seconde boucle « Pour ». |
FinPour | Fin de la première boucle « Pour ». |
- Pour i = 0, i_mini = 0
j = 1
Tab[1] = 3 > Tab[0] = 2
j = 2
Tab[2] = 1 < Tab[0] = 2
i_mini = 2
On échange Tab[0] = 2 (Tab[i]) et Tab[2] = 1 (Tab[i_mini]), ce qui donne [1, 3, 2]. - Pour i = 1, i_mini = 1
j = 2
Tab[2] = 1 < Tab[1] = 3
i_mini = 2
On échange Tab[1] = 3 (Tab[i]) et Tab[2] = 2 (Tab[i_mini]), ce qui donne [1, 2, 3]. - L’algorithme est fini car la première boucle Pour est terminée pour i = 1.
En Python, la fonction tri_selection(Tab) implémente le tri par sélection de Tab.
def tri_selection(Tab): | On définit la fonction tri_selection. |
n = len(Tab) | La longueur de la table len(Tab) est affectée à la variable n. |
for i in range(0, n−1): | Pour i allant de 0 à n−2. |
i_mini = i | i est affecté à la variable i_mini. |
for j in range(i+1, n): | Pour j allant de i+1 à n−1 |
if Tab[j] < Tab[i_mini]: | Si Tab[j] est plus petit que Tab[i_mini] |
i_mini = j | alors j est affecté à la variable i_mini. |
temp = Tab[i] | Tab[i] est affecté à la variable temporaire temp. |
Tab[i] = Tab[i_mini] | Tab[i_mini] est affecté à Tab[i]. |
Tab[i_mini] = temp | temp est affecté à Tab[i_mini]. |
L’algorithme de la partie précédente contient deux boucles Pour imbriquées. L’algorithme de tri par sélection se termine donc car une boucle Pour se termine toujours.
Pour l’algorithme de tri par sélection de la partie précédente, un invariant de boucle (proposition qui doit être vraie à chaque itération de l’algorithme) peut être :
P(i) : « Après la i-ème itération de la boucle Pour, dans le tableau Tab, les éléments Tab[0], Tab[1], …, Tab[i−1] sont triés dans l’ordre croissant et les autres éléments sont plus grands. »
Démonstration de la correction
|
Le cout d’un algorithme de tri par sélection sera donc toujours le même pour un tableau de taille n.
L’algorithme de tri par sélection contient deux boucles imbriquées.
Ainsi pour un tableau de taille n,
- la boucle externe Pour exécute n−1 instructions car for i in range(0, n−1) (i allant de 0 à n−2) correspond à n−1 itérations.
- Pour chaque valeur de i de la boucle externe,
le nombre d’instructions
exécutées par la boucle interne
Pour est de
(n−1) − (i+1) + 1 = n − 1 − i − 1 + 1 = n − 1 − i
Finalement, il y aura (n−1) + (n−2) + … + 3 + 2 + 1 instructions.
On admet la relation suivante :
.
Comme le terme dominant du cout est n2, on dit que le cout est quadratique.
Le cout du tri par sélection est quadratique dans tous les cas.
Vous avez obtenu75%de bonnes réponses !