Skip to content

Commit

Permalink
Merge pull request #20 from andreoss/sorting-algs
Browse files Browse the repository at this point in the history
Sorting algs
  • Loading branch information
japhb committed Feb 19, 2015
2 parents 7dbbb69 + bb03ba1 commit 6c017e2
Show file tree
Hide file tree
Showing 5 changed files with 161 additions and 0 deletions.
18 changes: 18 additions & 0 deletions minibenchmarks.pl
Original file line number Diff line number Diff line change
Expand Up @@ -144,4 +144,22 @@
perl6 => [qw( BENCH/perl6/point-class-add )],
nqp => [qw( BENCH/nqp/point-class-add )],
},
{
name => 'insertion-sort',
skip => [qw( )],
tags => [qw( sorting array )],
scale => 0,
expected => "0\n",
perl5 => [qw( BENCH/perl5/insertion-sort SCALE)],
perl6 => [qw( BENCH/perl6/insertion-sort SCALE)],
},
{
name => 'merge-sort',
skip => [qw( )],
tags => [qw( sorting array )],
scale => 0,
expected => "0\n",
perl5 => [qw( BENCH/perl5/merge-sort SCALE)],
perl6 => [qw( BENCH/perl6/merge-sort SCALE)],
},
]
28 changes: 28 additions & 0 deletions perl5/insertion-sort
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
use v5;
use strict;

sub insertion_sort {
my $a = shift;
for my $j ( 1 .. $#{$a} ) {
my $key = $a->[$j];
my $i = $j - 1;
while ( $i >= 0 && $a->[$i] > $key ) {
$a->[ $i + 1 ] = $a->[$i];
$i--;
}
$a->[ $i + 1 ] = $key;
}
}


my $scale = int shift @ARGV;

my @ints = (0, );
for (0 .. $scale ) {
push @ints, int($scale * rand);
}

push @ints, 0;

insertion_sort \@ints;
print $ints[0], "\n";
50 changes: 50 additions & 0 deletions perl5/merge-sort
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
use v5;
use strict;

sub Inf { ~0 }

sub merge {
my ( $a, $p, $z, $r ) = @_;
my $inv = 0;
my $i = 0;
my $j = 0;

my @l = @{$a}[ $p .. $z ];
my @r = @{$a}[ $z + 1 .. $r ];
push @l, Inf;
push @r, Inf;

for my $k ( $p .. $r ) {
if ( $l[$i] <= $r[$j] ) {
$a->[$k] = $l[$i];
$i++;
}
else {
$a->[$k] = $r[$j];
$j++;
}
}
}
my $iter = 0;

sub merge_sort {
my ( $a, $p, $r ) = @_;
$r //= $#{$a};
$p //= 0;
return 0 unless $p < $r;
my $z = int( ( $p + $r ) / 2 );
return merge_sort( $a, $p, $z ) +
merge_sort( $a, $z + 1, $r ) + merge( $a, $p, $z, $r );

}

my $scale = int shift @ARGV;
my @a = ( 0, );
for ( 0 .. $scale ) {
push @a, int( $scale * rand );
}

merge_sort( \@a );

print $a[0], "\n";

25 changes: 25 additions & 0 deletions perl6/insertion-sort
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
use v6;

sub insertion-sort(@a is rw) {
for 1 .. @a.end -> $j {
my $key = @a[$j];
# Insert @a[$j] into the sorted sequence @a[0..$j-1]
my $i = $j - 1;
while $i >= 0 && @a[$i] > $key {
@a[$i+1] = @a[$i];
$i-=1;
}
@a[$i+1] = $key;
}
}


sub MAIN(Int $scale) {
my @ints = 0; # in case SCALE == 0
for ^$scale {
@ints <== (rand * $scale).Int;
}
insertion-sort @ints;
say @ints[0];
}

40 changes: 40 additions & 0 deletions perl6/merge-sort
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
use v6;

sub merge(@a is rw, \p, \z, \r) {
my @l = @a[p .. z], Inf;
my @r = @a[z+1 .. r], Inf;
my $i = 0;
my $j = 0;

for p..r -> \k {
if @l[$i] <= @r[$j] {
@a[k] = @l[$i];
$i++;
} else {
@a[k] = @r[$j] ;
$j++;
}
}

}


sub merge-sort(@a is rw, \p = 0, \r = @a.end) {
if p < r {
my \z = (p + r) div 2;
merge-sort(@a, p, z);
merge-sort(@a, z+1, r);
merge(@a, p, z, r);
}
}

sub MAIN(Int $scale) {
my @a = 0;
for ^$scale {
@a <== (rand * $scale).Int
}
merge-sort @a;
say @a[0];
}


0 comments on commit 6c017e2

Please sign in to comment.