\ 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 ;