Code source tri "Shell"

let tri_shell tableau=
  let longueur=vect_length(tableau) and n=ref(0) in
  
  while (!n<longueur) do
    n:=3*(!n)+1
  done;
  
  while (!n<>0) do
    n:=(!n/3);
    for i=(!n) to (longueur-1) do
      let memoire=tableau.(i) and j=ref(i) in
      while ( !j>(!n-1) && tableau.((!j)-(!n))>memoire ) do
        tableau.(!j)<-tableau.((!j)-(!n));
        j:=(!j)-(!n)
      done;
      tableau.(!j)<-memoire;
    done
  done;;
(* tri_shell : 'a vect -> unit = <fun> *)