type T_SENS is (EN_MONTANT, EN_DESCENDANT);
procedure TRI (V : in out T_VECT) is
MIN : T_DISCRET := V'FIRST;
MAX : T_DISCRET := V'LAST;
MEDIAN : T_DISCRET;
procedure VENTILER is
DEBUT : T_DISCRET
:= MIN;
FIN
: T_DISCRET := MAX;
RESULT : T_ELEM
:= V(MIN);
SENS : T_SENS
:= EN_MONTANT;
begin -- VENTILER
MEDIAN := MIN;
loop
exit when DEBUT = FIN;
case SENS is
when EN_MONTANT =>
if (RESULT <= V(FIN))
then
FIN := T'DISCRET'PRED (FIN);
else
V (DEBUT) := V (FIN);
DEBUT := T_DISCRET'SUCC (DEBUT);
MEDIAN := FIN;
SENS := EN_DESCENDANT;
end if;
when EN_DESCENDANT =>
if (RESULT >= V (DEBUT))
then
DEBUT := T_DISCRET'SUCC (DEBUT);
else
V (FIN) := V (DEBUT);
FIN := T_DISCRET'PRED (FIN);
MEDIAN := DEBUT;
SENS := EN_MONTANT;
end if;
end case;
end loop;
V (MEDIAN) := RESULT;
end VENTILER;
begin -- TRI
if (MIN < MAX)
then
VENTILER;
TRI (V (MIN, T_DISCRET'PRED
(MEDIAN)));
TRI (V (T_DISCRET'SUCC
(MEDIAN), MAX));
end if;
end TRI;