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), $/;