- or download this
sub mergesort
{
...
my @high = mergesort( @_[$#_ / 2 + 1 .. $#_] );
map !@high || @low && $low[0] <= $high[0] ? shift @low : shift @high
+, 1..@_;
}
- or download this
sub sqs # stable quicksort
{
...
my $p = $_[@_ / 2]; # pivot
sqs( grep $_ < $p, @_ ), grep( $_ == $p, @_ ), sqs( grep $_ > $p, @_
+ );
}
- or download this
sub spsqs # single pass stable quicksort
{
...
push $items[$_ <=> $pivot]->@*, $_ for @_;
spsqs($items[-1]->@*), $items[0]->@*, spsqs($items[1]->@*)
}