Code source du tri "casiers"

let min_max_liste liste=
    let rec min_max l mini maxi=
        match l with
        |[]->mini,maxi
        |a::tt->min_max tt (min mini a) (max maxi a); in
    match liste with
    |[]->failwith "liste vide"
    |tt::qq->min_max qq tt tt;;
(* val min_max_liste : 'a list -> 'a * 'a = <fun> *)

let rec rempli_casier liste tableau indice=
    match liste with
    |[]->();
    |a::q->    tableau.(a-indice)<-tableau.(a-indice)+1;
        rempli_casier q tableau indice;;
(* val rempli_casier : int list -> int array -> int -> unit = <fun> *)

let recompose_liste tableau indice=
    let result=ref([]) in
    for i=Array.length(tableau)-1 downto 0 do
        for j=tableau.(i)-1 downto 0 do
            result:=(i+indice)::(!result);
        done;
    done;
    (!result);;
(* val recompose_liste : int array -> int -> int list = <fun> *)

let tri_casier liste=
    let (mini,maxi)=min_max_liste liste in
    let tableau=(Array.make (maxi-mini+1) 0) in
    rempli_casier liste tableau mini;
    recompose_liste tableau mini;;
(* val tri_casier : int list -> int list = <fun> *)