(* ineq doit être une inégalité stricte *) let tri_rapide ineq t = let ioe a b = ineq a b || a = b in let echanger i j = let k = t.(i) in t.(i) <- t.(j); t.(j) <- k; in let placer inf sup = let n = t.(sup) and bi = ref inf and bs = ref (sup-1) in while (!bi < !bs) do while ((!bi < sup) && (ioe t.(!bi) n)) do incr bi done; while ((!bs > inf) && (ioe n t.(!bs))) do decr bs done; if (!bi < !bs) then ( echanger !bi !bs; incr bi; decr bs; ); done; if (ineq t.(!bi) n) then incr bi; if (!bi < sup) then echanger !bi sup; !bi; in let rec trier inf sup = if (inf < sup) then ( let r = placer inf sup in trier inf (r-1); trier (r+1) sup; ); in trier 0 ((vect_length t) -1); ;; let tri_rapide_c = tri_rapide (prefix <) ;; let tri_rapide_d = tri_rapide (prefix >) ;;