home *** CD-ROM | disk | FTP | other *** search
- generic -- SHELLI VERSION for use with GENSORTSH.ADA
- type ELEMENT is private ;
- type ANY_ARRAY is array ( INTEGER range <> ) of ELEMENT ;
- with function ">" ( DUMMY1 , DUMMY2 : ELEMENT ) return BOOLEAN is <> ;
-
- package GENSORTSH is
-
- procedure SHSORT ( ARR1 : in out ANY_ARRAY ) ;
-
- end GENSORTSH ;
-
- package body GENSORTSH is
-
- procedure SHSORT ( ARR1 : in out ANY_ARRAY ) is
-
- TEMP : ELEMENT ;
- M , I , J , LIMIT : INTEGER ;
- SIZE : INTEGER := ARR1'LENGTH ;
- OFFSET : INTEGER := 1 - ARR1'FIRST ;
- begin
- M := SIZE ;
- while M > 1 loop -- log base 2 of SIZE times
- M := M / 2 ; -- through this loop
- LIMIT := SIZE - M ;
- for J in 1 .. LIMIT loop -- at most SIZE times
- I := J ; -- through this loop
- while I > 0 loop -- this loop depends on data,
-
- -- statistically about 2.5
- -- times through this loop
- --
- -- compare on whatever is being sorted
- if ARR1 ( I + OFFSET ) > ARR1 ( I + M + OFFSET ) then
-
- -- interchange, 3 statements for each array
- -- being sorted
- TEMP := ARR1 ( I + OFFSET ) ;
- ARR1 ( I + OFFSET ) := ARR1 ( I + M + OFFSET ) ;
- ARR1 ( I + M + OFFSET ) := TEMP ;
- I := I - M ; -- must check previous entry
- else
- exit ; -- while I > 0 , previous entries sorted
- end if ;
- end loop ; -- on while I > 0
- end loop ; -- on for J in 1..LIMIT
- end loop ; -- on while M > 1
- end SHSORT ;
- end GENSORTSH ;
-