Implémentation du tri par insertion en Java

Le tri par insertion fonctionne en séparant conceptuellement le tableau en deux zones : une portion gauche déjà ordonnée et une portion droite non triée. L'algorithme extrait successivement des éléments de la zone non triée et les place à leur position correcte dans la zone triée.

Voici une implémentation initiale qui illustre pas à pas le mécanisme de tri pour un petit tableau :


import java.util.Arrays;

public class TriInsertionDemo {
    public static void main(String[] args) {
        int[] donnees = {8, 3, 7, 1};
        effectuerTriParInsertion(donnees);
    }

    public static void effectuerTriParInsertion(int[] tableau) {
        // Première itération manuelle
        int valeurCourante = tableau[1];
        int positionRecherchee = 0;
        while (positionRecherchee >= 0 && valeurCourante < tableau[positionRecherchee]) {
            tableau[positionRecherchee + 1] = tableau[positionRecherchee];
            positionRecherchee--;
        }
        tableau[positionRecherchee + 1] = valeurCourante;
        System.out.println("État après première insertion :");
        System.out.println(Arrays.toString(tableau));

        // Deuxième itération manuelle
        valeurCourante = tableau[2];
        positionRecherchee = 1;
        while (positionRecherchee >= 0 && valeurCourante < tableau[positionRecherchee]) {
            tableau[positionRecherchee + 1] = tableau[positionRecherchee];
            positionRecherchee--;
        }
        tableau[positionRecherchee + 1] = valeurCourante;
        System.out.println("État après deuxième insertion :");
        System.out.println(Arrays.toString(tableau));

        // Troisième itération manuelle
        valeurCourante = tableau[3];
        positionRecherchee = 2;
        while (positionRecherchee >= 0 && valeurCourante < tableau[positionRecherchee]) {
            tableau[positionRecherchee + 1] = tableau[positionRecherchee];
            positionRecherchee--;
        }
        tableau[positionRecherchee + 1] = valeurCourante;
        System.out.println("État après troisième insertion :");
        System.out.println(Arrays.toString(tableau));
    }
}

La répétition du code ci-dessus suggère une optimisation via une boucle itérative. La version améliorée utilise une boucle for pour parcourir chaque élément et l'insérer dans la partie déjà triée :


import java.util.Arrays;

public class TriInsertionOptimise {
    public static void main(String[] args) {
        int[] ensemble = {42, 15, 89, 4};
        trierParInsertion(ensemble);
    }

    public static void trierParInsertion(int[] arr) {
        for (int pos = 1; pos < arr.length; pos++) {
            int cle = arr[pos];
            int idx = pos - 1;

            while (idx >= 0 && cle < arr[idx]) {
                arr[idx + 1] = arr[idx];
                idx--;
            }
            arr[idx + 1] = cle;
            System.out.println("Après insertion de l'élément à l'index " + pos);
            System.out.println(Arrays.toString(arr));
        }
    }
}

Dans cette version, la variable cle stocke l'élément à insérer, et idx représente l'indice de comparaison dans la zone triée. La boucle while déplace les éléments plus grands vers la droite jusqu'à trouver la position appropriée pour la clé.

Étiquettes: Java tri par insertion algorithme de tri

Publié le 4 juin à 21h51