sorting.quick: better interface, allow comparison to be passed in.

db4
John Benediktsson 2014-06-10 16:45:41 -07:00
parent 522bc270cc
commit fba9c1dab4
2 changed files with 35 additions and 12 deletions

View File

@ -1,6 +1,13 @@
USING: kernel tools.test ; USING: kernel sequences tools.test ;
IN: sorting.quick IN: sorting.quick
{ { } } [ { } dup quicksort ] unit-test { { } } [ { } dup natural-sort! ] unit-test
{ { 1 } } [ { 1 } dup quicksort ] unit-test { { 1 } } [ { 1 } dup natural-sort! ] unit-test
{ { 1 2 3 4 5 } } [ { 1 4 2 5 3 } dup quicksort ] unit-test { { 1 2 3 4 5 } } [ { 1 4 2 5 3 } dup natural-sort! ] unit-test
{
{ "dino" "fred" "wilma" "betty" "barney" "pebbles" "bamm-bamm" }
} [
{ "fred" "wilma" "pebbles" "dino" "barney" "betty" "bamm-bamm" }
dup [ length ] sort-with!
] unit-test

View File

@ -8,25 +8,41 @@ IN: sorting.quick
<PRIVATE <PRIVATE
:: (quicksort) ( seq from to -- ) :: quicksort ( seq from to quot -- )
from to < [ from to < [
from to + 2/ seq nth-unsafe :> pivot from to + 2/ seq nth-unsafe :> pivot
from to [ 2dup <= ] [ from to [ 2dup <= ] [
[ over seq nth-unsafe pivot before? ] [ [ 1 + ] dip ] while [
[ dup seq nth-unsafe pivot after? ] [ 1 - ] while over seq nth-unsafe pivot quot call( x x -- x )
+lt+ eq?
] [ [ 1 + ] dip ] while
[
dup seq nth-unsafe pivot quot call( x x -- x )
+gt+ eq?
] [ 1 - ] while
2dup <= [ 2dup <= [
[ seq exchange-unsafe ] [ seq exchange-unsafe ]
[ [ 1 + ] [ 1 - ] bi* ] 2bi [ [ 1 + ] [ 1 - ] bi* ] 2bi
] when ] when
] while ] while
[ seq from ] dip (quicksort) [ seq from ] dip quot quicksort
[ seq ] dip to (quicksort) [ seq ] dip to quot quicksort
] when ; inline recursive ] when ; inline recursive
PRIVATE> PRIVATE>
: quicksort ( seq -- ) : sort! ( seq quot: ( obj1 obj2 -- <=> ) -- )
0 over length 1 - (quicksort) ; [ 0 over length 1 - ] dip quicksort ;
: sort-with! ( seq quot: ( elt -- key ) -- )
[ compare ] curry sort! ; inline
: inv-sort-with! ( seq quot: ( elt -- key ) -- )
[ compare invert-comparison ] curry sort! ; inline
: natural-sort! ( seq -- )
[ <=> ] sort! ;