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

Le tri Shell

C'est une variante du tri par insertion. Dans ce tri, les éléments sont décalés de plusieurs éléments. La distance qui les sépare est appelé "pas". A chaque étape le tableau est affiné (mieux organisé) et le pas réduit. Lorsque le pas est de 1, cela revient à un tri par insertion.
Le pas est généralement calculé à partir de la formule suivante :
u(n+1) = (3*u(n)+1) avec u(0) = 1.

void triShell(int tableau[], const int longueur)
{
   int pas, i, j, memoire;
   pas = 0;

   // Calcul du pas
   while(pas<longueur)
   {
      pas = 3*pas+1;
   }

   while(n!=0) // tant que le pas est > 0
   {
      
pas = pas/3;
      for(i=n; i<longueur; i++)

      {
         memoire = tableau[i]; // valeur à décaler éventuellement
         j = i;

         while((j>(pas-1)) && (tableau[j-pas]>memoire))
         { // échange des valeurs
            tableau[j] = tableau[j-pas];
            j = j-pas;
         }
         tableau[j] = memoire;
      }
   }
}

Exemple :
Calcul du pas pour un tableau de taille n = 100 :
u(0) = 0
u(1) = 3 * u(0) + 1 = 3 * 0 + 1 = 1
u(2) = 3 * u(1) + 1 = 3 * 1 + 1 = 4
u(3) = 3 * u(2) + 1 = 3 * 4 + 1 = 13
u(4) = 3 * u(3) + 1 = 3 * 13 + 1 = 40
u(5) = 3 * u(4) + 1 = 3 * 40 + 1 = 121
Les valeurs successives que la pas prendra seront donc :
pas1 = 121 / 3 = 40
pas2 = pas1 / 3 = 40 / 3 = 13
pas3 = pas2 / 3 = 13 / 3 = 4
pas4 = pas3 / 3 = 4 / 3 = 1

Les grandes étapes de l'algorithme :

5331108713 5962264738
1331108753 5962264738
1331108753 5962264738
1331108753 5962264738
1331102653 5962874738
1331102647 5962875338
1331102647 3862875359
maintenant le pas = 1 donc on passe à
un tri par insertion
1331102647 3862875359
1331102647 3862875359
1013312647 3862875359
1013263147 3862875359
1013263147 3862875359
1013263138 4762875359
1013263138 4762875359
1013263138 4762875359
1013263138 4753628759
1013263138 4753596287

Complexité :
Le tri Shell est une excellente optimisation du tri par insertion. Le nombre d'opérations est de l'ordre de n*n.
En ce qui concerne la mémoire, très peu est nécessaire.

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