Vous êtes sur la page 1sur 5

Tri par insertion

Exemple du tri par insertion utilisant une liste de nombres alatoires

En informatique, le tri par insertion est un algorithme de tri classique, que la plupart des
personnes utilisent naturellement pour trier des cartes jouer : prendre les cartes mlanges
une une sur la table, et former une main en insrant chaque carte sa place.

En gnral, le tri par insertion est beaucoup plus lent que d'autres algorithmes comme le tri
rapide (ou quicksort) et le tri fusion pour traiter de grandes squences, car sa complexit
asymptotique est quadratique.

Le tri par insertion est cependant considr comme le tri le plus efficace sur des entres de
petite taille. Il est aussi trs rapide lorsque les donnes sont dj presque tries. Pour ces
raisons, il est utilis en pratique en combinaison avec d'autres mthodes comme le tri rapide.

En programmation informatique, on applique le plus souvent ce tri des tableaux. La


description et l'tude de l'algorithme qui suivent se restreignent cette version, tandis que
l'adaptation des listes est considre plus loin.

Sommaire
1 Description de l'algorithme
2 Exemple
3 Complexit
4 Variantes et optimisations
o 4.1 Optimisations pour les tableaux
o 4.2 Tri par insertion sur des listes
5 Combinaison avec d'autres tris
6 Voir aussi
7 Notes et rfrences

Description de l'algorithme
Illustration graphique du tri par insertion.

Dans l'algorithme, on parcourt le tableau trier du dbut la fin. Au moment o on considre


le i-me lment, les lments qui le prcdent sont dj tris. Pour faire l'analogie avec
l'exemple du jeu de cartes, lorsqu'on est la i-me tape du parcours, le i-me lment est la
carte saisie, les lments prcdents sont la main trie et les lments suivants correspondent
aux cartes encore mlanges sur la table.

L'objectif d'une tape est d'insrer le i-me lment sa place parmi ceux qui prcdent. Il
faut pour cela trouver o l'lment doit tre insr en le comparant aux autres, puis dcaler les
lments afin de pouvoir effectuer l'insertion. En pratique, ces deux actions sont frquemment
effectues en une passe, qui consiste faire remonter l'lment au fur et mesure jusqu'
rencontrer un lment plus petit.

Voici une description en pseudo-code de l'algorithme prsent. Les lments du tableau T sont
numrots de 0 n-1. n est la taille du tableau.

procdure tri_insertion(tableau T, entier n)


pour i de 1 n - 1
# mmoriser la valeur de T[i]
x T[i]
# dplacer d'un cran vers la droite les lments de T[0]..T[i-1]
qui sont plus grands que lui
j i
tant que j > 0 et T[j - 1] > x
T[j] T[j - 1]
j j - 1
fin tant que
# et mettre la valeur dans le "trou" que a a laiss
T[j] x
fin pour
fin procdure

Le tri par insertion est un tri stable (conservant l'ordre d'apparition des lments gaux) et un
tri en place (il n'utilise pas de tableau auxiliaire).

L'algorithme a la particularit d'tre online, c'est--dire qu'il peut recevoir la liste trier
lment par lment sans perdre en efficacit.

Exemple

Voici les tapes de l'excution du tri par insertion sur le tableau . Le tableau est
reprsent au dbut et la fin de chaque itration.
96148 69148

69148 16948

16948 14698

14698 14689

Complexit
La complexit du tri par insertion est (n2) dans le pire cas et en moyenne, et linaire dans le
meilleur cas. Plus prcisment :

1. Dans le pire cas, atteint lorsque le tableau est tri l'envers, l'algorithme effectue de
l'ordre de n2/2 affectations et comparaisons1 ;
2. Si les lments sont distincts et que toutes leurs permutations sont quiprobables (ie
avec une distribution uniforme), la complexit en moyenne de l'algorithme est de
l'ordre de n2/4 affectations et comparaisons1 ;
3. Si le tableau est dj tri, il y a n-1 comparaisons et au plus n affectations.

La complexit du tri par insertion reste linaire si le tableau est presque tri (par exemple,
chaque lment est une distance borne de la position o il devrait tre, ou bien tous les
lments sauf un nombre born sont leur place). Dans cette situation particulire, le tri par
insertion surpasse d'autres mthodes de tri : par exemple, le tri fusion et le tri rapide (avec

choix alatoire du pivot) sont tous les deux en mme sur une liste trie.

Variantes et optimisations
Optimisations pour les tableaux

Plusieurs modifications de l'algorithme permettent de diminuer le temps d'excution, bien que


la complexit reste quadratique.

On peut optimiser ce tri en commenant par un lment au milieu de la liste puis en


triant alternativement les lments aprs et avant. On peut alors insrer le nouvel
lment soit la fin, soit au dbut des lments tris, ce qui divise par deux le nombre
moyen d'lments dcals. Il est possible d'implmenter cette variante de sorte que le
tri soit encore stable.
En utilisant une recherche par dichotomie pour trouver l'emplacement o insrer

l'lment, on peut ne faire que comparaisons. Le nombre d'affectations reste en


2
O(n ).
L'insertion d'un lment peut tre effectue par une srie d'changes plutt que
d'affectations. En pratique, cette variante peut tre utile dans certains langages de
programmation (par exemple C++), o l'change de structures de donnes complexes
est optimis, alors que l'affectation provoque l'appel d'un constructeur de copie (en).
Le tri de Shell est une variante du tri par insertion qui amliore sa complexit asymptotique,
mais n'est pas stable.

Tri par insertion sur des listes

Le principe du tri par insertion peut tre adapt des listes chanes. Dans ce cas, le
dplacement de chaque lment peut se faire en temps constant (une suppression et un ajout
dans la liste). Par contre, le nombre de comparaisons ncessaires pour trouver l'emplacement
o insrer reste de l'ordre de n/4, la mthode de recherche par dichotomie ne pouvant pas tre
applique des listes.

Combinaison avec d'autres tris

En pratique, les algorithmes de tri en bass sur la mthode diviser pour rgner (tri
fusion, tri rapide) sont moins efficaces que le tri par insertion sur les petites entres, en
dessous d'une taille critique K (qui dpend de l'implmentation et de la machine utilise).
Dans ce type d'algorithmes, plutt que de diviser rcursivement l'entre jusqu' avoir des
sous-problmes lmentaires de taille 1 ou 2, on peut s'arrter ds que les sous-problmes ont
une taille infrieure K et les traiter avec le tri par insertion.

Pour le cas particulier du tri rapide, une variante plus efficace existe2 :

excuter d'abord le tri rapide en ignorant simplement les sous-problmes de taille


infrieure K ;
faire un tri par insertion sur le tableau complet la fin, ce qui est rapide car la liste est
dj presque trie.

Voir aussi
(fr) Implmentations du tri par insertion sur wikibooks.
(en) Illustration dynamique du tri par insertion [archive]

Notes et rfrences
1. a et b (en) Donald E. Knuth, The Art of Computer Programming, vol. 3 : Sorting and
Searching, 1998, 2e d. [dtail de ldition], section 5.2.1.
2. Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest et Clifford Stein,
Introduction l'algorithmique, Dunod, 2002 [dtail de ldition] (ex. 7.4.5, p. 153)

[masquer]
vm
Algorithmes de tri
Introsort
Smoothsort
Timsort
Tri bulles
Tri peigne
Tri arborescent
Tri bitonique
Tri comptage
Tri de Shell
Tri fusion
Tri pair-impair
Tri par base
Tri par insertion
Tri par paquets
Tri par slection
Tri par tas
Tri rapide
Tri stupide

Portail de l'informatique thorique