\ -*- mode: forth -*-
\ $Id: heapsort.gforth,v 1.1 2001/05/26 16:07:27 doug Exp $
\ http://www.bagley.org/~doug/shootout/
\ from Anton Ertl
0. argc @ 1- arg >number 2drop drop constant NUM
139968 constant IM
3877 constant IA
29573 constant IC
variable SEED
42 SEED !
: format-float
f$ dup >r 0<=
IF '0 emit
ELSE scratch r@ min type r@ precision - zeros THEN
'. emit r@ negate zeros
scratch r> 0 max /string 0 max -zeros type ;
: gen_random
IA SEED @ * IC + IM mod dup SEED ! s>d d>f
f* [ IM s>d d>f ] fliteral f/ ;
: heap-sort
swap { ra }
dup 2/ 1+ begin
dup 1 > if
1- dup floats ra + f@
else
over floats ra + dup >r f@
1 floats ra + f@ r> f!
swap 1- dup 1 = if
1 floats ra + f!
2drop exit
endif
swap endif
{ ir l }
l l 2* begin
dup ir <=
while
dup ir < if
dup floats ra + dup f@ float+ f@ f< if
1+
endif
endif
dup floats ra + f@ fover fover f< if
over floats ra + f!
nip dup 2*
else
fdrop drop ir 1+
endif
repeat
drop floats ra + f!
ir l
again ;
: main
NUM 1+ floats allocate throw
dup NUM floats bounds ?do
1e gen_random i f!
1 floats +loop
dup NUM heap-sort
NUM floats + f@ format-float cr ;
10 set-precision main bye