Forth sorting routines
SCR # 21
  0 ( 16 bit Numerical Sort Demo                      20AUG82MIM)   
  1
  2 FORTH DEFINITIONS  HEX
  3 7000 CONSTANT ARRAY1      ( address of data array)
  4 VARIABLE #ELEMENTS     ( number of 16 bit elements)
  5 VARIABLE DISTANCE      ( distance between elements)    
  6 VARIABLE VI            ( temporary indexes for nested DO's)
  7 VARIABLE VJ
  8 VARIABLE SEED   HERE SEED !
  9
 10 : RND           ( random # generator)   ( n --- )
 11    SEED @ 103 * 3 + 7FFF AND
 12      DUP SEED !  7FFF */ ;
 13 : CLRS PAGE CR CR 17 SPACES ." FORTH SORTING DEMO" CR ;
 14 : KEYMSG  ." any key continues.." CR KEY DROP ;
 15




SCR # 22
  0 ( 16 bit Numerical Sort Demo                      20AUG82MIM)
  1                                                   
  2 : RANDOM                  ( create random pattern in ARRAY1)
  3    #ELEMENTS @ 2* 0      ( set loop limit and initial index)
  4       DO 3E8 RND         ( fetch random # between 0 and 999)
  5          I 3 MOD 0= IF NEGATE      ( negate 1 out of three)
  6       THEN I ARRAY1 + !               ( store in array)
  7          2 +LOOP ;                    ( increment loop)
  8
  9 : REVERSE               ( create reversed pattern in ARRAY1)
 10    #ELEMENTS @ 0         ( set loop limit and initial index)
 11       DO #ELEMENTS @ I -               ( compute value)
 12          I 2* ARRAY1 + !              ( store in array)
 13       LOOP ;                          ( decrement loop)
 14
 15





SCR # 23
  0 ( 16 bit Numerical Sort Demo                      20AUG82MIM)
  1
  2 : NUM(I) @ ARRAY1 + ;            ( array fetch)
  3 : NUMI@ NUM(I) @ ;               ( and store)
  4 : NUMI! NUM(I) ! ;               ( operators)
  5
  6 : COMPARE VI NUMI@ VJ NUMI@ > ;     ( true if #I > #J)
  7
  8 : NUMSWAP          ( swap elements of array)   ( --- )
  9    VI NUMI@ VJ NUMI@ VI NUMI! VJ NUMI! ;
 10
 11 : NUMLIST             ( output number array)   ( --- )
 12    #ELEMENTS @ 2* 0 DO I DUP
 13       1A MOD 0= IF CR THEN ARRAY1 + @
 14          6 .R 2 +LOOP CR CR ;
 15




SCR # 24
  0 ( 16 bit Numerical Sort Demo                      20AUG82MIM)
  1
  2 : BUBBLESORT              ( sort data array)   ( --- )
  3    #ELEMENTS @ 1- 2* 0 DO I VI !
  4       #ELEMENTS @ 2* I 2+ DO I VJ !
  5          COMPARE IF NUMSWAP
  6       THEN 2 +LOOP 2 +LOOP ;
  7
  8 : SHUTTLESORT             ( sort data array)   ( --- )
  9    #ELEMENTS @ 1- 2* 0 DO
 10       -2 I DO I DUP VI ! 2+ VJ !
 11          COMPARE IF NUMSWAP ELSE LEAVE
 12       THEN -2 +LOOP 2 +LOOP ;
 13
 14 ( For decending sorts change > in COMPARE to <)
 15





SCR #25
  0 ( 16 bit Numerical Sort demo                      20AUG82MIM)
  1
  2 : SETDIST              ( set initial distance)    ( --- )
  3    1 BEGIN 2* DUP #ELEMENTS @ >
  4        UNTIL 2- DISTANCE ! ;
  5
  6 : DECDIST             ( decrement distance)   ( --- flag)
  7     DISTANCE @ 2/ 2/ 2* DUP DISTANCE ! 2 < ;
  8
  9     ( Shell-Metzner sort)
 10 : SHELLSORT  SETDIST BEGIN    ( sort data array)  ( --- )
 11    #ELEMENTS @ 2* DISTANCE @ - 0 DO -2 I DO
 12       I DUP VI ! DISTANCE @ + VJ ! COMPARE IF
 13          NUMSWAP ELSE LEAVE THEN DISTANCE @ NEGATE
 14             +LOOP 2 +LOOP DECDIST UNTIL ;
 15




SCR # 26
  0 ( 16 bit Numerical Sort Demo                      20AUG82MIM)
  1    ( benchmark it)
  2 : #ELEMENTS?  CR ." How many elements?  " QUERY CR CR
  3    INTERPRET #ELEMENTS ! ." random array" RANDOM NUMLIST ;
  4 : REVIT  CR ." reversed array" REVERSE NUMLIST ;
  5
  6 : BUBBS  #ELEMENTS? ." random bubblesort.." CR BEEP
  7    BUBBLESORT BEEP NUMLIST KEYMSG ." sorting sorted array.."
  8    CR BEEP BUBBLESORT BEEP KEYMSG REVIT
  9    ." reverse bubblesort.." CR BEEP BUBBLESORT BEEP
 10    NUMLIST KEYMSG ;
 11 : SHUTS  #ELEMENTS? ." random shuttlesort.." CR BEEP
 12    SHUTTLESORT BEEP NUMLIST KEYMSG ." sorting sorted array.."
 13    CR BEEP SHUTTLESORT BEEP KEYMSG REVIT
 14    ." reverse shuttlesort.." CR BEEP SHUTTLESORT BEEP
 15    NUMLIST KEYMSG ;





SCR # 27
  0 ( 16 bit Numerical Sort Demo                      20AUG82MIM)
  1
  2 : SHELS  #ELEMENTS? ." random shellsort.." CR BEEP
  3    SHELLSORT BEEP NUMLIST KEYMSG ." sorting sorted array.."
  4    CR BEEP SHELLSORT BEEP KEYMSG REVIT
  5    ." reverse shellsort.." BEEP SHELLSORT BEEP
  6    NUMLIST KEYMSG ;
  7 : DECODE  DUP 31 = IF BUBBS ELSE DUP 32 = IF SHUTS ELSE
  8    DUP 33 = IF SHELS ELSE 34 = IF QUIT THEN THEN THEN THEN ;
  9 : MENU  CR CR ." Specify sort algorithm:" CR
 10    ." 1 - Bubblesort" CR ." 2 - Shuttlesort" CR
 11       ." 3 - Shellsort" CR ." 4 - Exit demo " BEGIN
 12    KEY DUP 30 > OVER 35 < AND NOT WHILE DROP REPEAT ;
 13
 14 : DEMO  BEGIN CLRS MENU DUP DECODE AGAIN ;
 15         DECIMAL