Le tri de Shell

Algorithmique > Algorithmes de tri > Tri de Shell [ Commenter ]

Principe et optimisation

Le tri de Shell est une évolution du tri par insertion. En effet, on parcourt le tableau en utilisant un "pas" (c'est-à-dire un filtre) de plus en plus petit (donc de moins en moins grossier). Au dernier passage, on applique un "pas" de valeur 1 (ce qui équivaut à faire un tri par insertion sur un tableau presque trié et est donc assez rapide).

L'efficacité de cet algorithme est étroitement liée au choix des "pas" ou filtres successifs. Afin d'obtenir un code portable, il vaut mieux choisir une suite (de préférence géométrique ou composée). Cependant, certaines séries sont connues pour être encore plus efficace (notamment la suite : 1, 4, 10, 23, 57, 132, 301, 701).

Complexité en temps

Le tri de Shell a une complexité en temps de la forme Ω(n²). Cependant, il est plus rapide que le tri par insertion.

Conditions et évolutions

Bien que ce tri soit tout de même assez lent en comparaison avec des algorithmes plus complexes, le tri Shell peut être utilisé sans conditions particulières. Vous pouvez l'adapter à vos besoins :

Code (Pascal)

type TMyType = Int64;

procedure ShellSort(var A: Array of TMyType; N: Integer);

  function Compare(aV,aW: TMyType): Boolean;
  begin
    Result:=(aV<aW);
  end;

var Pas,I,J: Integer;
    Tmp: TMyType;
begin

  Pas:=0;
  While (Pas<N) do Pas:=3*Pas+1;

  While (Pas>0) do
    begin
      Pas:=Pas div 3;
      For I:= Pas to N-1 do
        begin
          Tmp:=A[I];
          J:=I-Pas;
          While ((J>=0) and Compare(Tmp,A[J])) do
            begin
              A[J+Pas]:=A[J];
              J:=J-Pas;
            end;
          A[J+Pas]:=Tmp;
        end;
    end;

end;