Post

Fiche Algorithmes de Tri en C

Fiche de Révision : Algorithmes de Tri en C

1. Introduction

Un algorithme de tri permet d’ordonner une liste d’éléments selon un critère donné (ordre croissant ou décroissant).

Les tris se divisent en deux grandes catégories :

  • Tris lents : Complexité élevée (O(n²)), adaptés aux petites listes.
  • Tris rapides : Complexité plus optimisée (O(n log n)), adaptés aux grandes listes.

2. Tris Lents (O(n²))

Les tris lents sont simples à implémenter mais inefficaces pour de grandes données.

Tri par Sélection

  • Trouve le plus petit élément et le place à sa position définitive.
  • Complexité : O(n²) dans tous les cas.
  • Peu efficace, sauf si les échanges sont plus coûteux que les comparaisons.

Tri à Bulles

  • Compare et échange les éléments adjacents pour les placer dans l’ordre.
  • Complexité : O(n²) dans le pire cas, O(n) si déjà trié.
  • Peu performant, rarement utilisé en pratique.

Tri par Insertion

  • Parcourt la liste en insérant chaque élément à sa position correcte.
  • Complexité : O(n²) dans le pire cas, O(n) si la liste est déjà triée.
  • Adapté aux petites listes ou aux données presque triées.

3. Tris Rapides (O(n log n))

Les tris rapides sont plus efficaces pour les grandes quantités de données.

Tri Fusion (Merge Sort)

  • Divise récursivement la liste en sous-listes puis fusionne les éléments triés.
  • Complexité : O(n log n) dans tous les cas.
  • Stable, efficace pour les grandes listes et utilisé en tri externe.

Tri Rapide (QuickSort)

  • Choisit un pivot, divise la liste en deux sous-listes et trie récursivement.
  • Complexité : O(n log n) en moyenne, O(n²) dans le pire cas (pivot mal choisi).
  • Très efficace pour les grandes listes en mémoire.

4. Comparaison des Algorithmes

TriComplexité MoyenneComplexité Pire CasStable ?Mémoire SupplémentaireUtilisation
SélectionO(n²)O(n²)Peu utilisé
BullesO(n²)O(n²)Très lent
InsertionO(n²)O(n²)Petites listes
FusionO(n log n)O(n log n)✅ (O(n))Grandes listes
RapideO(n log n)O(n²)Très efficace en mémoire

Stable : conserve l’ordre relatif des éléments égaux.
Non stable : peut changer l’ordre relatif des éléments égaux.

5. Choix du Bon Algorithme

  • Petites listes ou données déjà triées → Tri par insertion.
  • Grandes listes → Tri rapide (QuickSort) ou Tri fusion.
  • Besoins spécifiques (tri en place, mémoire limitée) → Heap Sort (non abordé ici).
  • Peu d’échanges mais coût de comparaison important → Tri par sélection.

6. Implémentation en Pseudo-code

Tri par Insertion

pour i de 1 à longueur(tableau) - 1
    clé = tableau[i]
    j = i - 1
    tant que j >= 0 et tableau[j] > clé
        tableau[j + 1] = tableau[j]
        j = j - 1
    tableau[j + 1] = clé

Tri par Sélection

pour i de 0 à longueur(tableau) - 1
    min = i
    pour j de i + 1 à longueur(tableau)
        si tableau[j] < tableau[min]
            min = j
    échanger tableau[i] et tableau[min]

Tri à Bulles

pour i de 0 à longueur(tableau) - 1
    pour j de 0 à longueur(tableau) - i - 1
        si tableau[j] > tableau[j + 1]
            échanger tableau[j] et tableau[j + 1]

Quicksort

fonction quicksort(tableau, bas, haut)
    si bas < haut
        pivot = partition(tableau, bas, haut)
        quicksort(tableau, bas, pivot - 1)
        quicksort(tableau, pivot + 1, haut)

fonction partition(tableau, bas, haut)
    pivot = tableau[haut]
    i = bas - 1
    pour j de bas à haut - 1
        si tableau[j] < pivot
            i = i + 1
            échanger tableau[i] et tableau[j]
    échanger tableau[i + 1] et tableau[haut]
    retourner i + 1

Tri Fusion

fonction triFusion(tableau)
    si longueur(tableau) > 1
        milieu = longueur(tableau) / 2
        gauche = tableau[0..milieu - 1]
        droite = tableau[milieu..longueur(tableau) - 1]

        triFusion(gauche)
        triFusion(droite)

        i = j = k = 0

        tant que i < longueur(gauche) et j < longueur(droite)
            si gauche[i] < droite[j]
                tableau[k] = gauche[i]
                i = i + 1
            sinon
                tableau[k] = droite[j]
                j = j + 1
            k = k + 1

        tant que i < longueur(gauche)
            tableau[k] = gauche[i]
            i = i + 1
            k = k + 1

        tant que j < longueur(droite)
            tableau[k] = droite[j]
            j = j + 1
            k = k + 1
Le contenu de cet article est la propriété exclusive de son auteur.