Download | Plain Text | Line Numbers
#!/usr/bin/perl
use Data::Dumper;
use POSIX qw(ceil floor);
use strict;
our ($cnt, $cnt2) = 0;
my @src = ();
for(my $i = 0; $i < 100; $i++)
{
push(@src, int(rand(500)));
}
my @src = (3, 1, 14, 4, 10, 5, 13);
#@src = reverse(@src);
our $ident = "";
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;
}
print $ident, print_array(\@src), $/;
sub swap
{
my ($a, $i, $j) = @_;
my $tmp = $$a[$i];
$$a[$i] = $$a[$j];
$$a[$j] = $tmp;
print $ident, print_array($a), $/;
}
sub run2
{
my ($a, $left, $right) = @_;
my $lastswap = 0;
while ($left < $right)
{
$cnt++;
my ($i, $j);
for($j = $right; $j > $left; $j--)
{
$cnt2++;
if ($$a[$j] < $$a[$j - 1])
{
swap($a, $j, $j-1);
$lastswap = $j;
}
}
print "lastswap=$lastswap", $/;
$left = $lastswap;
if ($lastswap == 0)
{
last;
}
for($i = $left; $i < $right; $i++)
{
$cnt2++;
if ($$a[$i] > $$a[$i + 1])
{
swap($a, $i, $i+1);
$lastswap = $i;
}
}
print "lastswap=$lastswap", $/;
$right = $lastswap;
#run($a, $left+1, $right-1);
}
}
sub run
{
my ($a, $left, $right) = @_;
while($left <= $right)
{
my ($i, $j);
for($i = $left; $i < $right; $i++)
{
$cnt2++;
if ($$a[$i] > $$a[$i + 1])
{
swap($a, $i, $i+1);
}
}
for($j = $right; $j > $left; $j--)
{
$cnt2++;
if ($$a[$j] < $$a[$j - 1])
{
swap($a, $j, $j-1);
}
}
$right--;
$left++;
}
}
#$cnt = 0;
#my @a = @src;
#run(\@a, 0, scalar(@a) - 1);
#print $ident, "final=", print_array(\@a), $/;
#print "cnt=", $cnt, " cnt2=", $cnt2, $/;
$cnt = $cnt2 = 0;
my @a = @src;
print scalar(@a), $/;
run2(\@a, 0, scalar(@a) - 1);
print $ident, "final=", print_array(\@a), $/;
print "cnt=", $cnt, " cnt2=", $cnt2, $/;
exit;
my $swapped;
my $len = scalar(@a);
do
{
$swapped = 0;
for (my $i = 0; $i < $len - 1; $i++)
{
if ($a[$i] > $a[$i + 1])
{
my $tmp = $a[$i];
$a[$i] = $a[$i+1];
$a[$i+1] = $tmp;
$swapped = 1;
print $ident, print_array(\@a), $/;
}
}
$len--;
}
while($swapped && $len > 0);
print $ident, print_array(\@a), $/;
exit;
for (my $i = 0; $i < scalar(@a); $i++)
{
for(my $j = 1; $j < scalar(@a) - $i; $j++)
{
if ($a[$j] < $a[$j-1])
{
my $tmp = $a[$j];
$a[$j] = $a[$j-1];
$a[$j-1] = $tmp;
print $ident, print_array(\@a), $/;
}
}
}
print $ident, print_array(\@a), $/;