Ceci est une ancienne révision du document !
Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 172
Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 172
Warning: Constant SVG_DPI already defined in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 75
Warning: Undefined variable $ml_array in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 264
Warning: Undefined array key "inResponsiveUnits" in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 282
Warning: Undefined array key "hasCssClasses" in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 301
Warning: Undefined array key "print" in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 322
Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214
Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214
Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214
Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214
Table des matières
Tri par sélection
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é.
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 la longueur de tab
POUR i ALLANT DE 0 À n - 2 FAIRE
soit i_min, le rang du plus petit item dans tab à partir de i
intervertir les items aux rangs i_min et i
FIN
FIN
On dirait qu'il n'y a qu'une seule boucle POUR. Mais il y en a une 2e cachée : la recherche de i_min nécessite de prévoir une boucle supplémentaire !
# recherche de i_min, rang du plus petit item,
# dans tab, à partir du rang i
soit i_min = i
POUR i ALLANT DE i À n - 1 FAIRE
SI élément en j est plus petit que celui en i_min ALORS
i_min = j
FIN
FIN
- À quoi correspond le
ide la boucle POUR ? - Pourquoi
ine 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 ?
