fork download
  1. #!/usr/bin/perl
  2.  
  3. @x = (0, 12, 20, 15, 29, 23, 17, 22, 35, 40, 26, 51, 19);
  4. $n = @x - 1;
  5. for my $i (1..$n){
  6. print "$x[$i] ";
  7. }
  8. print "\n";
  9. for (my $i = 2; $i <= $n; $i++){
  10. siftup($i);
  11. }
  12. for (my $i = $n; $i >= 2; $i--){
  13. swap(1, $i);
  14. siftdown($i-1);
  15. }
  16. for my $i (1..$n){
  17. print "$x[$i] ";
  18. }
  19. print "\n";
  20.  
  21. sub swap{
  22. my($a, $b) = @_;
  23. my $tmp = $x[$a];
  24. $x[$a] = $x[$b];
  25. $x[$b] = $tmp;
  26. }
  27.  
  28. sub siftup{
  29. my($n) = @_;
  30. my $i = $n;
  31. while ($i > 1) {
  32. my $p = int($i / 2);
  33. last if $x[$p] <= $x[$i];
  34. swap($p, $i);
  35. $i = $p;
  36. }
  37. }
  38.  
  39. sub siftdown{
  40. my($n) = @_;
  41. my $i = 1;
  42. while (2 * $i <= $n) {
  43. my $c = 2 * $i;
  44. if ($c + 1 <= $n && $x[$c + 1] < $x[$c]) {
  45. $c++;
  46. }
  47. last if $x[$i] <= $x[$c];
  48. swap($i, $c);
  49. $i = $c;
  50. }
  51. }
  52.  
Success #stdin #stdout 0s 5272KB
stdin
Standard input is empty
stdout
12 20 15 29 23 17 22 35 40 26 51 19 
51 40 35 29 26 23 22 20 19 17 15 12