đ 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 :
- Rapide :
- Complexité moyenne en O(n log n).
- Espace efficace :
- Implémentation en place (ne nécessite pas de mémoire supplémentaire significative).
- Flexible :
- Fonctionne bien pour des ensembles de données divers.
Inconvénients :
- Pire des cas :
- ComplexitĂ© en O(nÂČ) si le pivot est mal choisi.
- 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
- Choisir un pivot :
- Généralement, le premier, le dernier, ou un élément aléatoire.
- Partitionner le tableau :
- Réorganiser les éléments pour que ceux inférieurs au pivot soient à gauche et ceux supérieurs soient à droite.
- 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]
-
Pivot =
5
- Partition :
[3, 4, 2, 1] | 5 | [8, 7, 10]
- Partition :
-
Appliquer récursivement :
- Sous-tableau gauche :
[3, 4, 2, 1] â [1, 2, 3, 4]
- Sous-tableau droit :
[8, 7, 10] â [7, 8, 10]
- Sous-tableau gauche :
-
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
- Sélectionne un pivot (ici, le dernier élément).
- Place tous les éléments inférieurs au pivot à gauche.
- Place tous les éléments supérieurs au pivot à droite.
- Retourne lâindice oĂč le pivot est finalement positionnĂ©.
4.3 Fonction quick_sort
- Appelle récursivement
quick_sort
pour les sous-tableaux gauche et droit. - 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
Cas | Complexité Temporelle | Explication |
---|---|---|
Meilleur Cas | O(n log n) | Division équilibrée à chaque partition. |
Pire Cas | O(nÂČ) | Division dĂ©sĂ©quilibrĂ©e (par ex., tableau triĂ©). |
Cas Moyen | O(n log n) | En moyenne, les partitions sont raisonnablement équilibrées. |
7. Résumé
- Le Quick Sort est un algorithme de tri rapide basé sur la stratégie de diviser pour régner.
- Il partitionne le tableau autour dâun pivot, puis trie les sous-tableaux de maniĂšre rĂ©cursive.
- Cette implĂ©mentation respecte les normes de lâĂcole 42 :
- Pas de boucles
for
. - Déclarations et affectations séparées.
- Pas de boucles
Si vous avez des questions ou si vous voulez explorer des variantes, faites-moi savoirâŻ! đ