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 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 insertion dichotomique
Le tri par insertion est comparable au tri par sélection vu dans le TP2
Vous pouvez aussi trouver des cours dans la partie 1ere NSI de ce site : une fiche à imprimer et un cours sur le tri par insertion.
Principe
On considère une tableau L d'éléments comparables que l'on trie selon le protocole suivant.
- On classe au fur et à mesure de l'avancée dans le tableau :
- si le tableau n’a qu’un seul élément il est déjà trié,
- sinon on prend le deuxième et on le compare au premier pour les mettre dans le bon ordre.
- Si on suppose les
ipremiers éléments déjà classés on prend le(i + 1)-ème que l’on compare, par exemple en descendant à partir de la positioni, jusqu’à trouver, ou pas, un plus petit que lui et l'insérer alors à la bonne place.
Algorithme
FONCTION tri_par_insertion
ENTRÉE: tableau_a_trier, le tableau à trier
La fonction ne renvoie rien, le tableau est trié en place
DÉBUT
soit n la longueur de tableau_a_trier
POUR i allant de 1 à n - 1 FAIRE
soit item l'élément de rang i dans tableau_a_trier
soit j = i
TANT QUE j > 0 et l'élément de rang j-1 supérieur à item FAIRE
copier l'item de rang j-1 au rang j
j passe à j-1
FIN
copier item au rang j
FIN
FIN
Ici, le tri se fait en place, ce qui est une bonne chose du point de vue de l'utilisation de la mémoire. On peut apporter des améliorations pour limiter le nombre de comparaisons ou d'échanges, mais cela ne
change pas le principe d’insertion : il y a deux boucles imbriquées, ici une boucle globale en for et à l'intérieur une boucle en while.
- Traduisez cet algorithme en Python et testez.
- Écrivez une fonction
liste_aleatoire(N:int, n:int)créant une liste aléatoire denentiersitels que0 ⇐ i < N. - À l’aide de la fonction
timedu moduletime, donner la durée d’exécution de la fonctiontri_insertionpour quelques listes aléatoires de grande taille.
On pourra commencer par
$N = 10^7$ et $n$ dans $\left\lbrace 100, 1000, 10 000\right\rbrace$.
On prouvera plus tard la correction du programme et on étudiera sa complexité.
L'insertion dichotomique
En profitant du fait qu'au moment de chaque insertion, le début de liste est déjà trié, on peut procéder à une insertion dichotomique selon le principe qui suit :
- On suppose que l'on dispose d’une liste
Lde longueurntriée dans l’ordre croissant et d'un élémentacomparable que l’on veut ajouter à la liste en l'insérant de manière telle qu'en sortie la nouvelle liste soit encore triée dans l'ordre croissant. - On considère l'élément
mdu milieu de la liste – il faudra choisir lequel on prend lorsquen
est pair
- Si
a == malors on peut inséreraà gauche ou à droite dem(il faudra choisir), - si
a < malors on peut recommencer en insérantadans la sous-liste extraite deLen prenant les premiers éléments deLjusqu'àm - si
a > m, alors on insèreadans la sous-liste deLextraite à droite dem.
On montre que la complexité dans le pire des cas du tri avec insertion dichotomique est en $n\,\ln(n)$.
- Commencez par écrire une fonction qui cherche, par dichotomie, le bon indice d'insertion d'un élément
edans une liste déjà triéeL. - Écrivez une fonction qui implémente le tri par insertion dichotomique.
