( BEGIN-ALGORITHM) : newgap ( gap -- gap ) 10 * 13 / dup 9 = over 10 = or if drop 11 then dup 1 < if drop 1 then ; : swap_values ( a b -- a b swapped ) 2dup > dup >r ( a b swapped ) if ( a b ) swap ( b a true ) then ( a' b' ) r> ( a' b' swapped ) ; : swap_by_pointer ( p1 p2 -- swapped ) over @ over @ ( p1 p2 a b ) swap_values ( p1 p2 a b swapped ) >r ( p1 p2 a b ) rot ! ( p1 a ) swap ! r> ( swapped ) ; : inner_loop ( gap array length -- swapped ) { gap array length } false ( swapped ) length gap - 0 ?do array i cells + ( swapped p1 ) array i gap + cells + ( swapped p1 p2 ) swap_by_pointer ( swapped p1 p2 -- swapped swapped' ) or ( swapped ) loop ; : combsort ( array length -- ) { array length } length begin newgap dup array length inner_loop over 1 > or while repeat drop ; ( END-ALGORITHM ) 10 Constant LENGTH create array 1 , 6 , 5 , 3 , 8 , 9 , 7 , 2 , 4 , 0 , : printArray LENGTH 0 ?do array i cells + @ . loop ; : main array length combsort printArray ; main bye