Advertisement
Guest User

Untitled

a guest
Dec 23rd, 2013
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 0.77 KB | None | 0 0
  1. #!/usr/bin/perl
  2.  
  3. use warnings;
  4. use strict;
  5. use Time::HiRes qw(gettimeofday);
  6.  
  7. my $start_time = gettimeofday;
  8.  
  9. my $N = 10000000;
  10. my @a;
  11.  
  12. sub pushDown {
  13.     my ($pos, $N) = @_;
  14.     while (2 * $pos + 1 < $N) {
  15.         my $j = 2 * $pos + 1;
  16.         if ($j + 1 < $N && $a[$j + 1] > $a[$j]) {
  17.             ++$j;
  18.         }  
  19.         last if $a[$pos] >= $a[$j];
  20.         @a[$pos, $j] = @a[$j, $pos];
  21.         $pos = $j;
  22.     }  
  23. }
  24.  
  25. @a = 0 .. $N-1;
  26.  
  27. pushDown($_, $N) for reverse 0 .. $N / 2;
  28.  
  29. my $n = $N;
  30. while ($n > 1) {
  31.     @a[0, $n - 1] = @a[$n - 1, 0];
  32.     --$n;
  33.     pushDown(0, $n);
  34. }
  35.  
  36. while (my ($id, $key) = each @a) {
  37.     die unless $id == $key;
  38. }
  39.  
  40. my $end_time = gettimeofday;
  41. print "Done in ", int(1000 * ($end_time - $start_time)), " ms\n";
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement