Section courante

A propos

Section administrative du site

La technique de tri connue sous le nom de «Shell-Metzner», plus souvent appelée simplement «Shell Sort», constitue une amélioration ingénieuse des méthodes de tri par échanges successifs. Son objectif principal est de réduire considérablement le nombre de comparaisons et de permutations nécessaires pour remettre un tableau dans l'ordre. Contrairement au tri à bulles, qui compare essentiellement des éléments adjacents, le tri Shell commence par comparer des éléments éloignés les uns des autres. Cette approche permet de déplacer rapidement les valeurs très mal positionnées vers leur emplacement approximatif avant d'effectuer les ajustements finaux.

Le principe de fonctionnement est relativement simple. Dans un premier temps, le tableau est divisé virtuellement en plusieurs sous-groupes grâce à un écart, souvent appelé « gap ». Cet écart correspond généralement à la moitié de la taille totale du tableau. Les comparaisons sont alors réalisées entre des éléments séparés par cette distance fixe. Une fois ce passage terminé, l'écart est réduit progressivement, par exemple en le divisant par deux à chaque étape. Les comparaisons sont alors répétées avec des éléments de plus en plus rapprochés. Ce processus continue jusqu'à ce que l'écart atteigne la valeur 1, moment où le tableau est pratiquement ordonné et où les dernières corrections sont effectuées.

Cette stratégie permet d'obtenir de meilleures performances que plusieurs algorithmes de tri élémentaires. En effet, une grande partie du travail est accomplie dès les premières étapes, lorsque les écarts sont importants. Les éléments éloignés de leur position finale peuvent ainsi être déplacés rapidement, ce qui réduit le nombre total d'opérations nécessaires lors des passages suivants. Pour cette raison, le tri Shell est souvent considéré comme un excellent compromis entre simplicité d'implantation et efficacité.

À l'aide du code source Delphi présenté ci-dessous, vous découvrirez comment appliquer cette méthode sur un tableau de nombres. Le programme affiche tout d'abord le contenu initial du tableau, puis exécute les différentes phases de tri en réduisant progressivement l'écart entre les éléments comparés. Enfin, il affiche le tableau complètement trié, permettant ainsi de constater l'efficacité de cette technique classique de classement de données :

  1. Program ShellTri;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. Uses SysUtils;
  6.  
  7. Const
  8.  Tableau : Array[0..7] of Byte = (15, 10, 23, 2, 8, 9, 14, 16);
  9.  
  10. Var
  11.  K,L,I,J,T:Byte;
  12.  Inversion,Ecart:Integer;
  13.  
  14. BEGIN
  15.  Write('Avant:');
  16.  For K := 0 to High(Tableau) do Begin
  17.   Write(Tableau[K],', ');
  18.  End;
  19.  
  20.  Inversion := 0;
  21.  Ecart := High(Tableau) + 1;
  22.  Repeat
  23.   Ecart := Ecart shr 1;
  24.   Repeat
  25.    Inversion := 0;
  26.    For I := 0 to (High(Tableau) + 1) - Ecart - 1 do Begin
  27.     J := I + Ecart;
  28.     If(Tableau[J] < Tableau[I])Then Begin
  29.      T := Tableau[I];
  30.      Tableau[I] := Tableau[J];
  31.      Tableau[J] := T;
  32.      Inversion := 1;
  33.     End;
  34.    End;
  35.   Until 1 <> Inversion;
  36.  Until 1 = Ecart;
  37.  
  38.  WriteLn;
  39.  Write('Après:');
  40.  For L := 0 to High(Tableau) do Begin
  41.   Write(Tableau[L],', ');
  42.  End;
  43.  WriteLn;
  44. END.

on obtiendra le résultat suivant :

Avant:15, 10, 23, 2, 8, 9, 14, 16,
Après:2, 8, 9, 10, 14, 15, 16, 23,

Voir également

Algorithme - Tri

Dernière mise à jour : Dimanche, le 17 août 2014