rendered paste body
create numbers 7 , 6 , 8 , 23 , 1 , 2 , 11 , 12 ,
: array. ( array -- )
." #( "
dup cell+ swap @ 0 do dup @ . cell+ loop drop
." )" ;
: array-last ( array -- n )
dup @ cells + ;
: array-bounds ( array -- n n )
dup cell+ swap array-last ;
: exchange ( add1 add2 )
over @ over @ >r
swap ! r> swap ! ;
: cell- 1 cells - ;
: inspect-partition ( n n n n -- n n n n )
2over 2over 2swap
swap ." L1 ==> " @ . ." R1 ==> " @ . cr
swap ." L2 ==> " @ . ." R2 ==> " @ . ;
: pivot-value ( L R -- n )
nip @ ;
: partition ( L R -- L1 R1 L2 R2 )
2dup
2dup pivot-value >r
cr ." Partition Value: " r@ . ." -- stack is: " .s
begin 2dup <= while
swap ( r l ) begin dup @ r@ < while cell+ repeat
swap ( l r ) begin r@ over @ < while cell- repeat
2dup <= if
2dup exchange
cell- swap cell+ swap then repeat
r> drop
( L1 R2 L2 R1 )
swap rot ;
: qsort ( L R -- )
partition
( l1 r1 l2 r2 )
2dup < if recurse 2drop then 2drop
2dup < if recurse 2drop then 2drop ;
: sort ( array -- )
array-bounds qsort ;
numbers sort