Next: Chapitre 2
Up: Programmes en Caml
Previous: Programmes en Caml
0em
#open "printf";;
let nmax = 10;;
let a = make_vect nmax 0;;
let initialisation () =
for i = 0 to nmax - 1 do
a.(i) <- random__int 100
done;;
let impression () =
for i = 0 to nmax - 1 do
printf "%3d " a.(i)
done;
printf "\n";;
let tri_sélection* () =
let min = ref 0 in
for i = 0 to nmax - 2 do
min := i;
for j = i + 1 to nmax - 1 do
if a.(j) < a.(!min) then min := j
done;
let t = a.(!min) in
a.(!min) <- a.(i); a.(i) <- t
done;;
let main () =
(* On lit le tableau *)
initialisation ();
(* On trie *)
tri_sélection* ();
(* On imprime le résultat *)
impression ();
exit 0;;
(* Style plus Caml *)
let initialisation a =
for i = 0 to vect_length a - 1 do
a.(i) <- random__int 100
done;;
let impression a =
for i = 0 to vect_length a - 1 do
print_int a.(i); print_string " ";
done;
print_newline();;
let tri_sélection* a =
let min = ref 0 in
for i = 0 to vect_length a - 2 do
min := i;
for j = i + 1 to vect_length a - 1 do
if a.(j) < a.(!min) then min := j
done;
let t = a.(!min) in
a.(!min) <- a.(i); a.(i) <- t
done;;
let a = make_vect 10 0 in
initialisation a;
tri_selection* a;
impression a;;
(* {\em Tri par insertion, voir page \pageref{prog:tri-insertion}} *)
let tri_insertion a =
let j = ref 0 in
let v = ref 0 in
for i = 1 to vect_length a - 1 do
v := a.(i); j := i;
while !j > 0 && a.(!j - 1) > !v do
a.(!j) <- a.(!j - 1);
j := !j - 1
done;
a.(!j) <- !v;
done;;
(* {\em Tri shell, voir page \pageref{prog:tri-shell}} *)
let tri_shell a =
let h = ref 1 in
while !h <= vect_length a - 1 do
h := 3 * !h + 1
done;
while !h > 1 do
h := !h / 3;
for i = !h to vect_length a - 1 do
if a.(i) < a.(i - !h) then begin
let v = a.(i) in
let j = ref i in
while !j >= !h && a.(!j - !h) > v do
a.(!j) <- a.(!j - !h);
j := !j - !h
done;
a.(!j) <- v
end
done
done;;
(* Avec une exception pour sortir de
la boucle dès qu'on a trouvé *)
let bottin =
[| "paul", 2811;
"roger", 4501;
"laure", 2701;
"anne", 2702;
"pierre", 2805;
"yves", 2806 |];;
exception Found of int;;
let recherche s bottin =
try
for i = 0 to vect_length bottin - 1 do
let nom, tel = bottin.(i) in
if nom = s then raise (Found tel)
done;
raise Not_found
with Found tel -> tel;;
(* Recherche 3 *)
let bottin =
[| "paul", 2811;
"roger", 4501;
"laure", 2701;
"anne", 2702;
"pierre", 2805;
"yves", 2806;
"", 0 |];;
let recherche s bottin =
nom.(vect_length nom - 1) <- (s, 0);
let i = ref 0 in
while fst (bottin.(!i)) <> s do
incr i
done;
if !i = vect_length bottin
then raise Not_found
else
let _, tel = bottin.(!i) in tel;;
(* Lecture des données *)
while true do
printf "%d\n"
(recherche (input_line stdin) bottin)
done;;
(* {\em Recherche dichotomique, voir page \pageref{prog:recherche-dichotomique}} *)
let nom =
[| "anne"; "laure"; "paul";
"pierre"; "roger"; "yves" |];;
let tel =
[| 2702; 2701; 2811;
2805; 4501; 2806 |];;
let recherche_dichotomique x =
let g = ref 0
and d = ref (vect_length nom - 1)
and i = ref 0 in
while x <> nom.(!i) && !g <= !d do
i := (!g + !d) / 2;
if x < nom.(!i) then d := !i - 1
else g := !i + 1;
done;
if x = nom.(!i) then tel.(!i) else (-1);;
(* {\em Insertion 1, voir page \pageref{prog:insertion1}} *)
let n = ref 0;;
let insertion x val =
if !n >= vect_length nom
then failwith "Débordement de la table";
nom.(n) <- x;
tel.(n) <- val;
incr n;;
(* Fonction de hachage *)
let n = vect_length nom - 1
and b = 128;;
let h s =
let result = ref 0 in
for i = 0 to string_length s - 1 do
result :=
(!result * b + (int_of_char (s.[i]))) mod n
done;
!result;;
(* Recherche avec hachage *)
let col = make_vect (vect_length nom) (-1);;
let recherche x =
let i = ref (h x) in
while nom.(!i) <> x &&
col.(!i) <> -1
do i := col.(!i) done;
if x = nom.(!i) then tel.(!i) else -1;;
(* {\em Insertion avec hachage, voir page \pageref{prog:insertion1}} *)
let nom = make_vect nmax "";;
let tel = make_vect nmax 0;;
let col = make_vect nmax (-1);;
let nNoms = ref n;;
let insertion x val =
let i = h x in
if nom.(i) = "" then begin
nom.(i) <- x;
tel.(i) <- val
end else begin
if !nNoms >= nmax
then failwith "Débordement de la table"
else begin
nom.(!nNoms) <- x;
(* On met la nouvelle entrée en tête *)
(* de la liste des collisions *)
(* de sa classe d'équivalence *)
tel.(!nNoms) <- val;
col.(!nNoms) <- col.(i);
col.(i) <- !nNoms
end;
end;
incr nNoms;;
(* Recherche avec adressage ouvert,
{\em voir page \pageref{prog:recherche-hachage-ouvert}} *)
let recherche x =
let i = ref (h x) in
while nom.(!i) <> x && nom.(!i) <> "" do
i := (!i + 1) mod nmax
done;
if nom.(!i) = x then tel.(!i) else -1;;
let insertion x val =
if !nNoms > nmax
then failwith "Débordement de la table";
incr nNoms;
let i = ref (h x) in
while nom.(!i) <> x && nom.(!i) <> "" do
i := (!i + 1) mod nmax
done;
nom.(!i) <- x;
tel.(!i) <- val;;