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   

insรฉrer Operatravail de travail

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.

Travaux de tri par insertion

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.

Rรฉsumez cet article avec :