(* ===================================================== *)
(*      Apprentissage de la programmation avec OCaml     *)
(*      Catherine Dubois & Valérie Ménissier-Morain      *)
(*                Éditions Hermès Sciences               *)
(*                        Mars 2004                      *)
(* ===================================================== *)
(* Fichier MLSRC/Tris_vecteurs/fusion_vecteur.ml         *)
(* ===================================================== *)

let fusion t début fin t1 début1 fin1 t2 début2 fin2 =
  let i1 = ref début1
  and i2 = ref début2 in
  let
 i = ref début in
  while !i1 <= fin1 && !i2 <= fin2 do
    if
 t1.(!i1) <= t2.(!i2)
    then (t.(!i) <- t1.(!i1); incr i1)
    else (t.(!i) <- t2.(!i2); incr i2);
    incr i;
  done;
  if !i1 <= fin1
  then Array.blit t1 !i1 t !i (fin1 - !i1+1)
  else Array.blit t2 !i2 t !i (fin2 - !i2+1);;

let rec tri_fusion_rec t t' début fin =
  if fin > début
  then
    begin
      let
 début1 = début
      and fin1 = début+(fin-début)/2 in
      let
 début2 = fin1+1
      and fin2 = fin in
      tri_fusion_rec t' t début1 fin1;
      tri_fusion_rec t' t début2 fin2;
      fusion t début fin t' début1 fin1 t' début2 fin2
    end;;

let tri_fusion t =
  tri_fusion_rec t (Array.copy t) 0 (Array.length t-1);;

Ce document a été traduit de LATEX par HEVEA.