Download | Plain Text | No Line Numbers


  1. #!/usr/bin/perl
  2.  
  3. use Data::Dumper;
  4. use POSIX qw(ceil floor);
  5. use strict;
  6.  
  7. our ($cnt, $cnt2) = 0;
  8.  
  9. my @src = ();
  10. for(my $i = 0; $i < 100; $i++)
  11. {
  12. push(@src, int(rand(500)));
  13. }
  14.  
  15. my @src = (3, 1, 14, 4, 10, 5, 13);
  16. #@src = reverse(@src);
  17.  
  18. our $ident = "";
  19.  
  20. sub print_array
  21. {
  22. my ($a) = @_;
  23. my $str = "[";
  24. for(my $i = 0; $i < scalar(@$a); $i++)
  25. {
  26. $str .= ((defined($$a[$i])) ? $$a[$i] : "_");
  27. $str .= ", ";
  28. }
  29. $str = substr($str, 0, length($str)-2);
  30. $str .= "]";
  31. return $str;
  32. }
  33.  
  34. print $ident, print_array(\@src), $/;
  35.  
  36. sub swap
  37. {
  38. my ($a, $i, $j) = @_;
  39. my $tmp = $$a[$i];
  40. $$a[$i] = $$a[$j];
  41. $$a[$j] = $tmp;
  42. print $ident, print_array($a), $/;
  43. }
  44.  
  45. sub run2
  46. {
  47. my ($a, $left, $right) = @_;
  48. my $lastswap = 0;
  49. while ($left < $right)
  50. {
  51. $cnt++;
  52. my ($i, $j);
  53. for($j = $right; $j > $left; $j--)
  54. {
  55. $cnt2++;
  56. if ($$a[$j] < $$a[$j - 1])
  57. {
  58. swap($a, $j, $j-1);
  59. $lastswap = $j;
  60. }
  61. }
  62. print "lastswap=$lastswap", $/;
  63. $left = $lastswap;
  64.  
  65. if ($lastswap == 0)
  66. {
  67. last;
  68. }
  69.  
  70. for($i = $left; $i < $right; $i++)
  71. {
  72. $cnt2++;
  73. if ($$a[$i] > $$a[$i + 1])
  74. {
  75. swap($a, $i, $i+1);
  76. $lastswap = $i;
  77. }
  78. }
  79. print "lastswap=$lastswap", $/;
  80. $right = $lastswap;
  81. #run($a, $left+1, $right-1);
  82. }
  83. }
  84.  
  85. sub run
  86. {
  87. my ($a, $left, $right) = @_;
  88. while($left <= $right)
  89. {
  90. my ($i, $j);
  91. for($i = $left; $i < $right; $i++)
  92. {
  93. $cnt2++;
  94. if ($$a[$i] > $$a[$i + 1])
  95. {
  96. swap($a, $i, $i+1);
  97. }
  98. }
  99. for($j = $right; $j > $left; $j--)
  100. {
  101. $cnt2++;
  102. if ($$a[$j] < $$a[$j - 1])
  103. {
  104. swap($a, $j, $j-1);
  105. }
  106. }
  107. $right--;
  108. $left++;
  109. }
  110. }
  111.  
  112. #$cnt = 0;
  113. #my @a = @src;
  114. #run(\@a, 0, scalar(@a) - 1);
  115. #print $ident, "final=", print_array(\@a), $/;
  116. #print "cnt=", $cnt, " cnt2=", $cnt2, $/;
  117.  
  118. $cnt = $cnt2 = 0;
  119. my @a = @src;
  120. print scalar(@a), $/;
  121. run2(\@a, 0, scalar(@a) - 1);
  122. print $ident, "final=", print_array(\@a), $/;
  123. print "cnt=", $cnt, " cnt2=", $cnt2, $/;
  124.  
  125.  
  126. exit;
  127.  
  128. my $swapped;
  129. my $len = scalar(@a);
  130. do
  131. {
  132. $swapped = 0;
  133. for (my $i = 0; $i < $len - 1; $i++)
  134. {
  135. if ($a[$i] > $a[$i + 1])
  136. {
  137. my $tmp = $a[$i];
  138. $a[$i] = $a[$i+1];
  139. $a[$i+1] = $tmp;
  140. $swapped = 1;
  141. print $ident, print_array(\@a), $/;
  142. }
  143. }
  144. $len--;
  145. }
  146. while($swapped && $len > 0);
  147. print $ident, print_array(\@a), $/;
  148.  
  149. exit;
  150. for (my $i = 0; $i < scalar(@a); $i++)
  151. {
  152. for(my $j = 1; $j < scalar(@a) - $i; $j++)
  153. {
  154. if ($a[$j] < $a[$j-1])
  155. {
  156. my $tmp = $a[$j];
  157. $a[$j] = $a[$j-1];
  158. $a[$j-1] = $tmp;
  159. print $ident, print_array(\@a), $/;
  160. }
  161. }
  162. }
  163.  
  164. print $ident, print_array(\@a), $/;
  165.