57 lines
1.5 KiB
Factor
57 lines
1.5 KiB
Factor
! Copyright (C) 2014 John Benediktsson
|
|
! See http://factorcode.org/license.txt for BSD license
|
|
|
|
USING: arrays combinators kernel locals math math.order
|
|
math.private sequences sequences.private strings vectors ;
|
|
|
|
IN: sorting.quick
|
|
|
|
<PRIVATE
|
|
|
|
:: quicksort ( seq from to quot: ( obj1 obj2 -- <=> ) -- )
|
|
from to < [
|
|
from to fixnum+fast 2/ seq nth-unsafe :> pivot
|
|
|
|
from to [ 2dup <= ] [
|
|
[
|
|
over seq nth-unsafe pivot quot call
|
|
+lt+ eq?
|
|
] [ [ 1 fixnum+fast ] dip ] while
|
|
|
|
[
|
|
dup seq nth-unsafe pivot quot call
|
|
+gt+ eq?
|
|
] [ 1 fixnum-fast ] while
|
|
|
|
2dup <= [
|
|
[ seq exchange-unsafe ]
|
|
[ [ 1 fixnum+fast ] [ 1 fixnum-fast ] bi* ] 2bi
|
|
] when
|
|
] while
|
|
|
|
[ seq from ] dip quot quicksort
|
|
[ seq ] dip to quot quicksort
|
|
] when ; inline recursive
|
|
|
|
: check-array-capacity ( n -- n )
|
|
integer>fixnum-strict dup array-capacity?
|
|
[ "too large" throw ] unless ; inline
|
|
|
|
PRIVATE>
|
|
|
|
: sort! ( seq quot: ( obj1 obj2 -- <=> ) -- )
|
|
[ 0 over length check-array-capacity 1 - ] dip quicksort ; inline
|
|
|
|
: sort-with! ( seq quot: ( elt -- key ) -- )
|
|
[ compare ] curry sort! ; inline
|
|
|
|
: inv-sort-with! ( seq quot: ( elt -- key ) -- )
|
|
[ compare invert-comparison ] curry sort! ; inline
|
|
|
|
GENERIC: natural-sort! ( seq -- )
|
|
|
|
M: object natural-sort! [ <=> ] sort! ;
|
|
M: array natural-sort! [ <=> ] sort! ;
|
|
M: vector natural-sort! [ <=> ] sort! ;
|
|
M: string natural-sort! [ <=> ] sort! ;
|