All pastes #269397 Raw Edit

Untitled

public text v1 · immutable
·published 2006-12-06 15:44 UTC
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 ;