====== Tri par sélection ======
[[https://fr.wikipedia.org/wiki/Tri_par_s%C3%A9lection|Page Wikipedia]]
===== Principe =====
Tout le long de l'algorithme, on considère deux zones du tableau. L'une à gauche -- sur fond orange dans l'exemple -- et l'autre à droite -- sur fond jaune dans l'exemple.
L'algorithme est constitué principalement d'une boucle répétitive. À chaque exécution de cette boucle, on **sélectionne** le plus petit élément parmi les jaunes et on le déplace à la suite de la zone orange. La zone orange s'en trouve augmentée d'un élément -- ce qui diminue la jaune.
La boucle s'arrête quand la zone jaune ne compte plus qu'un seul élément. Le tableau est alors trié.
{{ :nsi:premiere:tableau:tri_selection.svg |}}
Le tableau donné en exemple contient 8 items. Combien de recherche de plus petit élément doit-on faire ? Et si le tableau contenait n items ?
La recherche du plus petit élément est plus ou moins coûteuse selon le nombre d'items à considérer. Dans l'exemple, lors du premier passage, il faut chercher parmi 8 items ; lors du 2e passage, parmi 7 items... Ce cumul donne une bonne **estimation** du nombre de calculs élémentaires nécessaires pour ce tri :
$$8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 = 36$$
===== Preuve de correction =====
On profite de notre travail sur les algorithmes de tri pour réfléchir aux problèmes de correction.
Un algorithme est correct si pour toutes les entrées permises :
* il termine en un temps fini,
* il donne la réponse attendue
==== Terminaison ====
La boucle répétitive s'exécute tant qu'il reste plus d'un item dans la zone jaune.
**À vous :** justifiez que cette boucle arrive forcément à sa fin.
==== Validité de la réponse ====
On veut prouver qu'à la fin de l'algorithme, les items du tableau sont bien dans l'ordre croissant.
**À vous :** justifiez que :
- les items de la zones oranges sont toujours inférieurs ou égaux à ceux de la zone jaune,
- les items de la zone orange sont dans l'ordre
- le tableau est dans l'ordre à la fin de l'exécution
===== L'algorithme =====
FONCTION tri_par_selection
ENTRÉE: tab, le tableau à trier
La fonction ne renvoie rien, le tableau est trié en place
DÉBUT
soit n le nombre d'éléments de tab
POUR i ALLANT DE 0 À n - 2 compris FAIRE
m = i
POUR j ALLANT DE i+1 à n-1 compris FAIRE
SI tab[j] < tab[m] ALORS
m = j
FIN SI
FIN POUR
intervertir tab[m] et tab[i]
FIN POUR
FIN
- À quoi correspond le ''i'' de la boucle POUR ?
- Pourquoi ''i'' ne va que jusqu'à ''n - 2'' ?
- Implémentez cet algorithme en Python.
- En fonction de ''n'', et en considérant que chaque ligne de votre programme s'exécute en un temps T, quelle sera la durée totale de ce tri ?
{{ :nsi:premiere:tableau:tri:tri_selection.cor.pdf |Correction}}