(* ===================================================== *)
(* Apprentissage de la programmation avec OCaml *)
(* Catherine Dubois & Valérie Ménissier-Morain *)
(* Éditions Hermès Sciences *)
(* Mars 2004 *)
(* ===================================================== *)
(* Fichier MLSRC/Tris_vecteurs/tri_tas.ml *)
(* ===================================================== *)
type 'a tas = {tab: 'a array; mutable maximal: int};;
let échanger t i j =
let tmp = t.(i) in
t.(i) <- t.(j);
t.(j) <- tmp;;
let fils_max t i =
if 2*i+1>t.maximal then i else
if 2*i+1=t.maximal || t.tab.(2*i+1) > t.tab.(2*i+2)
then 2*i+1 else 2*i+2;;
let rec réorganiser_descente_branche t i =
if i = t.maximal then (* feuille *) () else
let f = fils_max t i in
if t.tab.(f) > t.tab.(i)
then (échanger t.tab f i; réorganiser_descente_branche t f);;
let supprimer_max_tas t =
échanger t.tab 0 t.maximal;
t.maximal <- t.maximal-1;
réorganiser_descente_branche t 0;;
let rec insérer_tas_tri t i =
let père = (i-1)/2 in
t.maximal <- t.maximal +1;
if t.tab.(père) < t.tab.(i)
then (échanger t.tab père i; insérer_tas_tri t père);;
let tri_tas v =
let t = {tab = v; maximal = 0} in
let len = Array.length v - 1 in
for i = 1 to len do insérer_tas_tri t i; done;
for i = len downto 1 do supprimer_max_tas t; done;;
Ce document a été traduit de LATEX par
HEVEA.