Tri par insertion : algorithme avec C, C++, Java, Python Exemples
Quโest-ce que le tri par insertion ?
Le tri par insertion est l'un des algorithmes de tri par comparaison utilisรฉs pour trier les รฉlรฉments en itรฉrant sur un รฉlรฉment ร la fois et en plaรงant l'รฉlรฉment dans sa position correcte.
Chaque รฉlรฉment est insรฉrรฉ sรฉquentiellement dans une liste dรฉjร triรฉe. La taille de la liste dรฉjร triรฉe est initialement de un. L'algorithme de tri par insertion garantit que les k premiers รฉlรฉments sont triรฉs aprรจs la kiรจme itรฉration.
Caractรฉristiques de l'algorithme de tri par insertion
L'algorithme de tri par insertion prรฉsente les caractรฉristiques importantes suivantes :
- Il sโagit dโune technique de tri stable, elle ne modifie donc pas lโordre relatif des รฉlรฉments รฉgaux.
- Il est efficace pour les ensembles de donnรฉes plus petits mais pas pour les listes plus grandes.
- Le tri par insertion est adaptatif, ce qui rรฉduit son nombre total d'รฉtapes s'il est partiellement triรฉ. tableau est fourni en entrรฉe pour le rendre efficace.
Comment Insรฉrer Operatravail ?
Dans lโalgorithme de tri par insertion, lโopรฉration dโinsertion est utilisรฉe pour trier les รฉlรฉments non triรฉs. Cela permet d'insรฉrer un nouvel รฉlรฉment dans une liste dรฉjร triรฉe.
Pseudocode de l'opรฉration d'insertion :
Considรฉrons une liste A de N รฉlรฉments.
A[N-1] is the element to be inserted in the sorted sublist A[0..N-2]. For i = N-1 to 1: if A[i] < A[i-1], then swap A[i] and A[i-1] else Stop
Dans l'exemple ci-dessus, un nouvel รฉlรฉment 6 doit รชtre insรฉrรฉ dans une liste dรฉjร triรฉe.
รtape 1) Par rapport ร l'รฉlรฉment adjacent gauche de A[5], 9 > 6, nous รฉchangeons la position de 9 et 6. L'รฉlรฉment 6 est maintenant dรฉplacรฉ vers A[4].
รtape 2) Maintenant, nous comparons A[4] et A[3], et nous constatons que A[3] > A[4], nous รฉchangeons ร nouveau la position de 6 et 8.
รtape 3) Comparez maintenant A[3] et A[2], car A[2] > A[3] รฉchange la position de 7 et 6.
รtape 4) Nous comparons A[1] et A[2], et comme A[1] < A[2], c'est ร dire que l'รฉlรฉment adjacent gauche n'est plus plus grand. Nous concluons maintenant que 6 est insรฉrรฉ correctement, et nous arrรชtons l'algorithme ici.
Comment fonctionne le tri par insertion
Lโopรฉration dโinsertion dรฉcrite ci-dessus constitue lโรฉpine dorsale du tri par insertion. La procรฉdure d'insertion est exรฉcutรฉe sur chaque รฉlรฉment et ร la fin, nous obtenons la liste triรฉe.
L'exemple de figure ci-dessus montre le fonctionnement du tri par insertion dans la structure de donnรฉes. Initialement, un seul รฉlรฉment est prรฉsent dans la sous-liste triรฉe, c'est-ร -dire 4. Aprรจs avoir insรฉrรฉ A[1], c'est-ร -dire 3, la taille de la sous-liste triรฉe passe ร 2.
C++ Programme de tri par insertion
#include <iostream>
using namespace std;
int main(){
//unsorted list
int unsorted[] = {9,8,7,6,5,4,3,3,2,1};
//size of list
int size_unsorted = sizeof(unsorted) / sizeof(unsorted[0]);
//printing unsorted list
cout << "\nUnsorted: ";
for(int i = 0 ; i < size_unsorted ; i++){
cout << unsorted[i] << " ";
}
int current_element,temp;
for(int i = 1; i < size_unsorted; i++){
current_element = unsorted[i];
for(int j = i-1; j >= 0 && unsorted[j] > current_element; j--){
//swapping if current element is lesser
temp = unsorted[j+1];
unsorted[j+1] = unsorted[j];
unsorted[j] = temp;
}
}
//printing sorted list
cout << "\nSorted: ";
for(int i = 0 ; i < size_unsorted ; i++){
cout << unsorted[i] << " ";
}
return 0;
}
Sortie :
Unsorted: 9 8 7 6 5 4 3 3 2 1 Sorted: 1 2 3 3 4 5 6 7 8 9
Code C pour le tri par insertion
#include <stdio.h>
int main() {
//unsorted list
int unsorted[] = {9,8,7,6,5,4,3,3,2,1};
//size of list
int size_unsorted = sizeof(unsorted) / sizeof(unsorted[0]);
//printing unsorted list
printf("\nUnsorted: ");
for(int i = 0 ; i < size_unsorted ; i++){
printf("%d ", unsorted[i]);
}
int current_element, temp;
for(int i = 1; i < size_unsorted; i++){
current_element = unsorted[i];
for(int j = i-1; j >= 0 && unsorted[j] > current_element; j--){
//swapping if current element is lesser
temp = unsorted[j+1];
unsorted[j+1] = unsorted[j];
unsorted[j] = temp;
}
}
//printing sorted list
printf("\nSorted: ");
for(int i = 0 ; i < size_unsorted ; i++){
printf("%d ", unsorted[i]);
}
return 0;
}
Sortie :
Output: Unsorted: 9 8 7 6 5 4 3 3 2 1 Sorted: 1 2 3 3 4 5 6 7 8 9
Python Programme de tri par insertion
#unsorted list
unsorted = [9,8,7,6,5,4,3,3,2,1]
#size of list
size_unsorted = len(unsorted)
#printing unsorted list
print("\nUnsorted: ", end="")
for i in range(size_unsorted):
print(unsorted[i], end=" ")
for i in range(1, size_unsorted):
current_element = unsorted[i]
j = i - 1
while j >= 0 and unsorted[j] > current_element:
#swapping if current element is lesser
unsorted[j+1], unsorted[j] = unsorted[j], unsorted[j+1]
j -= 1
#printing sorted list
print("\nSorted: ", end="")
for i in range(size_unsorted):
print(unsorted[i], end=" ")
Sortie :
Unsorted: 9 8 7 6 5 4 3 3 2 1 Sorted: 1 2 3 3 4 5 6 7 8 9
Propriรฉtรฉs du tri par insertion
Voici les propriรฉtรฉs importantes du tri par insertion :
- En ligne: Le tri par insertion peut trier les รฉlรฉments au fur et ร mesure de leur rรฉception. Autrement dit, si nous avons dรฉjร triรฉ une liste dโรฉlรฉments et ajoutรฉ quelques รฉlรฉments supplรฉmentaires aux listes, nous nโavons pas besoin de rรฉexรฉcuter toute la procรฉdure de tri. Au lieu de cela, nous devons uniquement itรฉrer sur les รฉlรฉments nouvellement ajoutรฉs.
- En place: La complexitรฉ spatiale de l'algorithme de tri par insertion est constante et ne nรฉcessite pas d'espace supplรฉmentaire. Cet algorithme trie les รฉlรฉments sur place.
- Stable: Dans le tri par insertion, nous n'รฉchangeons pas les รฉlรฉments si leurs valeurs sont รฉgales. Par exemple, deux รฉlรฉments, x et y, sont รฉgaux et x apparaรฎt avant y dans les listes non triรฉes, puis dans la liste triรฉe, x apparaรฎtra avant y. Cela rend le tri par insertion stable.
- Adaptatif: A algorithme de tri est adaptatif si cela prend moins de temps si les รฉlรฉments d'entrรฉe ou le sous-ensemble d'รฉlรฉments sont dรฉjร triรฉs. Comme nous l'avons vu ci-dessus, le meilleur temps d'exรฉcution du tri par insertion est O(N), et le pire temps d'exรฉcution est O(N^2). Le tri par insertion est l'un des algorithmes de tri adaptatif.
Complexitรฉ du tri par insertion
Complexitรฉ spatiale
Le tri par insertion ne nรฉcessite pas d'espace supplรฉmentaire pour trier les รฉlรฉments, la complexitรฉ spatiale est constante, c'est-ร -dire O(1).
Complexitรฉ temporelle
Comme le tri par insertion itรจre chaque รฉlรฉment simultanรฉment, il nรฉcessite N-1 passes pour trier N รฉlรฉments. Pour chaque passe, il peut effectuer un รฉchange nul si les รฉlรฉments sont dรฉjร triรฉs, ou un รฉchange si les รฉlรฉments sont classรฉs par ordre dรฉcroissant.
- Pour le pass 1, les swaps minimum requis sont zรฉro et les swaps maximum requis sont 1.
- Pour le pass 2, les swaps minimum requis sont zรฉro et les swaps maximum requis sont 2.
- Pour le pass N, le swap minimum requis est zรฉro et le swap maximum requis est N.
- Le swap minimum est nul, donc la meilleure complexitรฉ temporelle est O(N) pour itรฉrer N passes.
- Le total maximum des swaps est de (1+2+3+4+..+N) i. N(N+1)/2, la pire complexitรฉ temporelle est O(N^2).
Voici la complexitรฉ temporelle importante du tri par insertion :
- Pire complexitรฉ des cas: O(n2) : trier un tableau par ordre dรฉcroissant lorsqu'il est par ordre croissant est le pire des cas.
- Meilleur cas de complexitรฉ : O(n) : Meilleur La complexitรฉ du cas se produit lorsque le tableau est dรฉjร triรฉ, la boucle externe s'exรฉcute n fois alors que la boucle interne ne s'exรฉcute pas du tout. Il n'y a que n nombre de comparaisons. Donc, dans ce cas, la complexitรฉ est linรฉaire.
- Complexitรฉ moyenne des cas : O(n2) : Cela se produit lorsque les รฉlรฉments d'un tableau apparaissent dans un ordre confus, qui n'est ni ascendant ni dรฉcroissant.
Rรฉsumรฉ
- Le tri par insertion est une mรฉthode d'algorithme de tri basรฉe sur la comparaison.
- Il sโagit dโune technique de tri stable, elle ne modifie donc pas lโordre relatif des รฉlรฉments รฉgaux.
- Sur chaque รฉlรฉment, l'opรฉration d'insertion est utilisรฉe pour insรฉrer l'รฉlรฉment dans la sous-liste triรฉe.
- Le tri par insertion est un algorithme de tri sur place.
- La complexitรฉ temporelle la plus mauvaise et moyenne du tri par insertion est quadratique, c'est-ร -dire O (N ^ 2).
- Le tri par insertion ne nรฉcessite aucun espace auxiliaire.


