type T_VECT is array (T_DISCRET range <>) of T_ELEM;

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;