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. my @src = (35, 40, 12, 30, 94, 18, 6, 67);
  8. #my @src = (8, 6, 2, 3, 7, 4);
  9. #@src = reverse(@src);
  10.  
  11. our $ident = 0;
  12.  
  13. sub print_array
  14. {
  15. my ($a) = @_;
  16. my $str = "[";
  17. for(my $i = 0; $i < scalar(@$a); $i++)
  18. {
  19. $str .= ((defined($$a[$i])) ? $$a[$i] : "_");
  20. $str .= ", ";
  21. }
  22. $str = substr($str, 0, length($str)-2);
  23. $str .= "]";
  24. return $str;
  25. }
  26.  
  27. sub print_marks
  28. {
  29. my ($a, $x, $pos) = @_;
  30. my $str = " ";
  31. my $i = 0;
  32. for(my $j = 0; $j < scalar(@$a); $j++)
  33. {
  34. if ($j == $$pos[$i])
  35. {
  36. $str .= $x." ";
  37. $str .= (" " x length($$a[$j]));
  38.  
  39. $i++;
  40. if ($i > scalar(@$pos) - 1)
  41. {
  42. last;
  43. }
  44. }
  45. else
  46. {
  47. $str .= (" " x length($$a[$j]));
  48. $str .= " ";
  49. }
  50. }
  51. return $str;
  52. }
  53.  
  54. sub partition
  55. {
  56. my ($a, $l, $r, $x) = @_;
  57. my $i = $l - 1;
  58. my $j = $r;
  59.  
  60. do
  61. {
  62. do
  63. {
  64. $i++;
  65. }
  66. until($$a[$i] <= $x);
  67.  
  68. do
  69. {
  70. $j--;
  71. }
  72. until($j <= $i || $$a[$j] >= $x);
  73.  
  74. print "i=$i, j=$j", $/;
  75. if ($i < $j)
  76. {
  77. print (" " x $ident);
  78. print print_marks($a, "x", [$i, $j]), $/;
  79.  
  80. my $tmp = $$a[$i];
  81. $$a[$i] = $$a[$j];
  82. $$a[$j] = $tmp;
  83. }
  84. }
  85. until($i >= $j);
  86.  
  87. if ($i != $r)
  88. {
  89. my $tmp = $$a[$i];
  90. $$a[$i] = $$a[$r];
  91. $$a[$r] = $tmp;
  92. print (" " x $ident);
  93. print print_marks($a, ".", [$i, $r]), $/;
  94. }
  95.  
  96. return $i;
  97. }
  98.  
  99. sub quicksort
  100. {
  101. my ($a, $l, $r) = @_;
  102. $ident += 2;
  103. if ($l < $r)
  104. {
  105. print (" " x $ident);
  106. print print_array(\@src), $/;
  107. print (" " x $ident);
  108. print print_marks($a, "|", [$l, $r]), $/;
  109.  
  110. my $x = $$a[$r];
  111. my $p = partition($a, $l, $r, $x);
  112. quicksort($a, $l, $p - 1);
  113. quicksort($a, $p + 1, $r);
  114. }
  115. $ident -= 2;
  116. }
  117.  
  118.  
  119. quicksort(\@src, 0, scalar(@src) - 1);
  120.