package body Comb is procedure Swap(A, B : in out Element_T) is Temp : Element_T; begin Temp := A; A := B; B := Temp; end Swap; procedure Sort(Arr : in out Array_T) is Swapped : Boolean; Gap : Natural; Shrink : constant Float := 1.3; begin if Arr'Length <= 1 then return; end if; Gap := Arr'Length; loop Gap := Natural(Float'Floor(Float(Gap) / Shrink)); if Gap < 1 then Gap := 1; end if; Swapped := False; for I in Integer range Index_T'Pos(Arr'First) .. (Index_T'Pos(Arr'Last) - Gap) loop if Arr(Index_T'Val(I)) > Arr(Index_T'Val(I + Gap)) then Swap( Arr(Index_T'Val(I)), Arr(Index_T'Val(I + Gap)) ); Swapped := True; end if; end loop; exit when Gap = 1 and not Swapped; end loop; end Sort; end Comb;