Programmez par plaisir! 30-07-2010
03:39
Prog-Info > C++ > Tri et Recherche > Tri rapide. Sommaire

Le tri rapide

Le principe de cet algorithme est de diviser un ensemble d'éléments en deux parties. Pour faire cette séparation, une valeur pivot est choisie. Les valeurs sont séparées par le pivot suivant qu'elles lui soit supérieures ou inférieures. Ensuite, on fait la même chose pour les deux sous ensembles. Cet algorithme est donc récursif.
Le choix du pivot est un problème majeur, le mieux serait de pouvoir séparer les ensembles en deux parties égales. Toutefois une recherche s'avererait trop coûteuse. C'est pour cela qu'on choisit le premier élément ou le dernier élément.

int partition(int tableau[], const int debut, const int fin)
{
   int compteur = debut;
   int pivot = tableau[debut];
   int i;

   for(i=debut+1; i<=fin; i++)
   {
      if(tableau[i]<pivot) // si élément inférieur au pivot

      {
         compteur++; // incrémente compteur cad la place finale du pivot
         echanger(tableau, compteur, i); // élément positionné
      }
   echanger(tableau, compteur, debut); // le pivot est placé
   return compteur; // et sa position est retournée
}

void triRapideAux(int tableau[], const int debut, const int fin)
{
   if(debut<fin) // cas d'arrêt pour la récursivité
   {
      int pivot = partition(tableau, debut, fin); // division du tableau
      triRapideAux(tableau, debut, pivot-1); // trie partie1
      triRapideAux(tableau, pivot+1, fin); // trie partie2
   }
}

void triRapide(int tableau[], const int longueur)
{
   triRapideAux(tableau, 0, longueur-1);
}

Exemple :
Les grandes étapes de l'algorithme :

5331108713 5962264738
3831101326 4753875962
2631101338 4753875962
1310263138 4753875962
1013263138 4753875962
1013263138 4753875962
1013263138 4753625987
1013263138 4753596287

Complexité :
Le nombre d'opérations effectuées dans cet algorithme est très variable.
Dans le meilleur des cas, il de de l'ordre de n*ln(n).
Dans le pire des cas (ordre décroissant), il est de n*n.
En ce qui concerne la mémoire, c'est un algorithme récursif donc un peu de mémoire. Cela dépend de la taille du tableau en partie.

Le tri par création Le tri fusion
[Plan Plan] [A propos A Propos] [ 661188 ]
Copyright ©2002-2009 Prog-info Tous droits réservés.