rendered paste body\ could be DEFERed to allow sorting different things
: select-pivot ( first last -- pivot ) over - 2/ + aligned ;
: greater? ( addr1 addr2 -- flag ) @ swap @ < ;
: items ( addr1 -- addr2 ) cells ;
: exchange ( addr1 addr2 -- ) 2dup @ >r @ swap ! r> swap ! ;
: partition ( first last pivot -- first1 last1 first2 last2 )
over exchange
>r dup dup begin dup r@ <= while
dup r@ greater? 0= if 2dup exchange swap 1 items + swap then
1 items + repeat
drop dup >r 2 items - r> r> ;
: quicksort ( first last -- )
2dup < if 2dup select-pivot partition recurse recurse else 2drop then ;