swuecho
11/23/2013 - 4:52 AM

sort.pl

package Acme::Algorithm;
use v5.14;
our $VERSION = '0.01';
use Exporter::Auto;

sub quicksort {
    # get from  http://geekblog.oneandoneis2.org/index.php/2013/05/16/quicksort-golf
    my $array = shift;
    return [] unless (@$array);
    my $head = shift @$array;
    return [ @{ quicksort([grep { $_ <= $head } @$array])}, $head , @{ quicksort([grep { $_ > $head } @$array])}];  
   
}   

sub permutation {}

## sort
sub _merge {

    my ($left,$right) = @_;
    my @left = @$left;
    my @right = @$right;
    my @result;

    while ( @left or @right ) {
        if ( @left and @right ) {
            if ( $left[0] <= $right[0] ) {    
                push @result, $left[0];
                shift @left;
            } else {
                push @result, $right[0];
                shift @right;
            }
        } elsif ( @left ) {
                push @result, $left[0];
                shift @left;
        } elsif ( @right ) {
                push @result, $right[0];
                shift @right;
        }
    }
    @result;
}

sub merge_sort {
    my @all = @_;

    return @all if @all <= 1;

    my (@left, @right);
    my $middle = int($#all / 2);
    @left = @all[0..$middle];
    @right = @all[1 + $middle..$#all];
    
    @left = merge_sort(@left);
    @right = merge_sort(@right);

    return _merge(\@left,\@right)    
}

1;
__END__

=encoding utf-8