Download | Plain Text | Line Numbers
#!/usr/bin/perl
use Data::Dumper;
use POSIX qw(ceil floor);
use strict;
my @a = (12, 7, 8, 15, 1, 11, 2, 5);
#@a = reverse(@a);
our $ident = "";
sub mergesort
{
my ($a, $l, $r) = @_;
if ($l < $r)
{
my $m = floor(($l+$r)/2);
#print $ident, "mergesort(a, $l, $r) (m=$m)", $/;
#$ident .= " ";
mergesort($a, $l, $m);
mergesort($a, $m+1, $r);
print $ident, "--------> a=", print_array($a), $/;
merge($a, $l, $m, $r);
print $ident, "--------> a=", print_array($a), $/;
#$ident = substr($ident, 0, length($ident)-2);
}
}
sub merge
{
my ($a, $l, $m, $r) = @_;
#print $ident, "l=$l, m=$m, r=$r", $/;
my $i = $l;
my $j = $m + 1;
my $k = $l;
my @b = ();
#print $ident, "a=", print_array($a), $/;
while($i <= $m && $j <= $r)
{
#print $ident, "i=$i, j=$j, k=", $k, " $a[$i] <= $a[$j]", $/;
if ($$a[$i] >= $$a[$j])
{
$b[$k] = $$a[$i];
$i++;
}
else
{
$b[$k] = $$a[$j];
$j++;
}
$k++;
#print $ident, "b=", print_array(\@b), $/;
}
if ($i > $m)
{
for (my $h = $j; $h <= $r; $h++)
{
#print $ident, "x=", $k+$h-$j, $/;
$b[$k + $h - $j] = $$a[$h];
}
}
else
{
for (my $h = $i; $h <= $m; $h++)
{
#print $ident, "y=", $k+$h-$i, $/;
$b[$k + $h - $i] = $$a[$h];
}
}
#print $ident, "b=", print_array(\@b), $/;
for(my $h = $l; $h <= $r; $h++)
{
$$a[$h] = $b[$h];
}
#print $ident, "a=", print_array($a), $/;
}
my $a = \@a;
print $ident, "in=", print_array($a), $/;
mergesort($a, 0, scalar(@$a) - 1);
print $ident, "out=", print_array($a), $/;
sub print_array
{
my ($a) = @_;
my $str = "[";
for(my $i = 0; $i < scalar(@$a); $i++)
{
$str .= ((defined($$a[$i])) ? $$a[$i] : "_");
$str .= ", ";
}
$str = substr($str, 0, length($str)-2);
$str .= "]";
return $str;
}