Code source du tri "casiers"

let tri_casier tableau=
  let longueur=Array.length(tableau) in
  if longueur>0 then
    begin
      let mini=ref(tableau.(0)) and maxi=ref(tableau.(0)) in

      for i=1 to (longueur-1) do
        if (!mini)>tableau.(i) then mini:=tableau.(i);
        if (!maxi)<tableau.(i) then maxi:=tableau.(i);
      done;
      
      let longueur2=(!maxi-(!mini)+1) in
      let tableau_bis=Array.make longueur2 0 in
    
      for i=0 to (longueur-1) do
        tableau_bis.(tableau.(i))<-tableau_bis.(tableau.(i))+1;
      done;
    
      let compteur=ref(0) in
      for i=0 to (longueur2-1) do
        while tableau_bis.(i)>0 do
          tableau.(!compteur)<-i;
          compteur:=(!compteur)+1;
          tableau_bis.(i)<-tableau_bis.(i)-1;
        done;
      done;
    end;;
(* val tri_casier : int array -> unit = <fun> *)