package body Quick is procedure Swap(A, B : in out Element_T) is Temp : Element_T; begin Temp := A; A := B; B := Temp; end Swap; procedure In_Place(Arr : in out Array_T) is Pivot, Left, Right : Index_T; begin if Arr'Length <= 1 then return; end if; Pivot := Arr'First; Left := Index_T'Succ(Pivot); Right := Arr'Last; loop while not (Arr(Left) > Arr(Pivot)) and Left < Arr'Last loop Left := Index_T'Succ(Left); end loop; while Arr(Right) > Arr(Pivot) and Right > Arr'First loop Right := Index_T'Pred(Right); end loop; exit when Left >= Right; Swap(Arr(Left), Arr(Right)); end loop; Swap(Arr(Pivot), Arr(Right)); if Right > Arr'First then In_Place( Arr(Arr'First .. Index_T'Pred(Right)) ); end if; if Right < Arr'Last then In_Place( Arr(Index_T'Succ(Right) .. Arr'Last) ); end if; end In_Place; end Quick;