📂 Tri Rapide (Quick Sort) (27-quick-sort.c)

Le Tri Rapide (Quick Sort) est l’un des algorithmes de tri les plus populaires grĂące Ă  sa rapiditĂ© et son efficacitĂ©. Il utilise la stratĂ©gie de diviser pour rĂ©gner en partitionnant un tableau en sous-tableaux plus petits.


1. Pourquoi Utiliser le Quick Sort ?

Avantages :

  1. Rapide :
    • ComplexitĂ© moyenne en O(n log n).
  2. Espace efficace :
    • ImplĂ©mentation en place (ne nĂ©cessite pas de mĂ©moire supplĂ©mentaire significative).
  3. Flexible :
    • Fonctionne bien pour des ensembles de donnĂ©es divers.

Inconvénients :

  1. Pire des cas :
    • ComplexitĂ© en O(nÂČ) si le pivot est mal choisi.
  2. Sensibilité au choix du pivot :
    • Peut ralentir pour des donnĂ©es dĂ©jĂ  triĂ©es ou trĂšs dĂ©sĂ©quilibrĂ©es.

2. Principe du Tri Rapide

  1. Choisir un pivot :
    • GĂ©nĂ©ralement, le premier, le dernier, ou un Ă©lĂ©ment alĂ©atoire.
  2. Partitionner le tableau :
    • RĂ©organiser les Ă©lĂ©ments pour que ceux infĂ©rieurs au pivot soient Ă  gauche et ceux supĂ©rieurs soient Ă  droite.
  3. Appliquer récursivement :
    • Appliquer les Ă©tapes ci-dessus sur les sous-tableaux gauche et droit jusqu’à ce qu’ils soient triĂ©s.

Exemple :

Tableau initial :

[5, 3, 8, 4, 2, 7, 1, 10]

  1. Pivot = 5

    • Partition : [3, 4, 2, 1] | 5 | [8, 7, 10]
  2. Appliquer récursivement :

    • Sous-tableau gauche : [3, 4, 2, 1] → [1, 2, 3, 4]
    • Sous-tableau droit : [8, 7, 10] → [7, 8, 10]
  3. Fusion :

    • [1, 2, 3, 4] + [5] + [7, 8, 10] → [1, 2, 3, 4, 5, 7, 8, 10]

3. Implémentation en C

Code Quick Sort conforme aux normes de l’École 42

#include <stdio.h>
 
// Fonction pour échanger deux éléments
void swap(int *a, int *b)
{
    int temp;
 
    temp = *a;
    *a = *b;
    *b = temp;
}
 
// Fonction pour partitionner le tableau
int partition(int *arr, int low, int high)
{
    int pivot;
    int i;
    int j;
 
    pivot = arr[high]; // Choisir le dernier élément comme pivot
    i = low - 1;
 
    j = low;
    while (j < high)
    {
        if (arr[j] < pivot)
        {
            i++;
            swap(&arr[i], &arr[j]);
        }
        j++;
    }
    swap(&arr[i + 1], &arr[high]);
    return (i + 1);
}
 
// Fonction récursive pour le tri rapide
void quick_sort(int *arr, int low, int high)
{
    int pi;
 
    if (low < high)
    {
        pi = partition(arr, low, high); // Partitionner le tableau
        quick_sort(arr, low, pi - 1);   // Trier la partie gauche
        quick_sort(arr, pi + 1, high); // Trier la partie droite
    }
}
 
// Fonction pour afficher le tableau
void print_array(int *arr, int size)
{
    int i;
 
    i = 0;
    while (i < size)
    {
        printf("%d ", arr[i]);
        i++;
    }
    printf("\n");
}
 
// Fonction principale
int main(void)
{
    int arr[] = {5, 3, 8, 4, 2, 7, 1, 10};
    int n;
 
    n = sizeof(arr) / sizeof(arr[0]);
 
    printf("Tableau initial : ");
    print_array(arr, n);
 
    quick_sort(arr, 0, n - 1);
 
    printf("Tableau trié : ");
    print_array(arr, n);
 
    return (0);
}

4. Explications

4.1 Fonction swap

  • Échange les valeurs de deux Ă©lĂ©ments dans le tableau.
  • UtilisĂ©e dans la fonction partition pour rĂ©organiser les Ă©lĂ©ments autour du pivot.

4.2 Fonction partition

  1. Sélectionne un pivot (ici, le dernier élément).
  2. Place tous les éléments inférieurs au pivot à gauche.
  3. Place tous les éléments supérieurs au pivot à droite.
  4. Retourne l’indice oĂč le pivot est finalement positionnĂ©.

4.3 Fonction quick_sort

  1. Appelle récursivement quick_sort pour les sous-tableaux gauche et droit.
  2. La rĂ©cursion s’arrĂȘte lorsque low >= high, ce qui signifie qu’un sous-tableau est triĂ©.

5. Résultat

Entrée :

Tableau initial : 5 3 8 4 2 7 1 10

Sortie :

Tableau trié : 1 2 3 4 5 7 8 10

6. Complexité Temporelle

CasComplexité TemporelleExplication
Meilleur CasO(n log n)Division équilibrée à chaque partition.
Pire CasO(nÂČ)Division dĂ©sĂ©quilibrĂ©e (par ex., tableau triĂ©).
Cas MoyenO(n log n)En moyenne, les partitions sont raisonnablement équilibrées.

7. Résumé

  1. Le Quick Sort est un algorithme de tri rapide basé sur la stratégie de diviser pour régner.
  2. Il partitionne le tableau autour d’un pivot, puis trie les sous-tableaux de maniĂšre rĂ©cursive.
  3. Cette implĂ©mentation respecte les normes de l’École 42 :
    • Pas de boucles for.
    • DĂ©clarations et affectations sĂ©parĂ©es.

Si vous avez des questions ou si vous voulez explorer des variantes, faites-moi savoir ! 😊