Download | Plain Text | No Line Numbers
- #!/usr/bin/perl
-
- use Data::Dumper;
- 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);
- merge($a, $l, $m, $r);
- #$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;
-
- sub print_array
- {
- my ($a) = @_;
- my $str = "[";
- {
- $str .= ", ";
- }
- $str .= "]";
- }
-