SHOW:
|
|
- or go back to the newest paste.
| 1 | #!/usr/bin/perl | |
| 2 | ||
| 3 | use warnings; | |
| 4 | use strict; | |
| 5 | ||
| 6 | my $N = 10000000; | |
| 7 | my @a; | |
| 8 | ||
| 9 | sub pushDown {
| |
| 10 | my ($pos, $N) = @_; | |
| 11 | while (2 * $pos + 1 < $N) {
| |
| 12 | my $j = 2 * $pos + 1; | |
| 13 | if ($j + 1 < $N && $a[$j + 1] > $a[$j]) {
| |
| 14 | ++$j; | |
| 15 | } | |
| 16 | last if $a[$pos] >= $a[$j]; | |
| 17 | @a[$pos, $j] = @a[$j, $pos]; | |
| 18 | $pos = $j; | |
| 19 | } | |
| 20 | } | |
| 21 | ||
| 22 | @a = 0 .. $N-1; | |
| 23 | ||
| 24 | pushDown($_, $N) for reverse 0 .. $N / 2; | |
| 25 | ||
| 26 | my $n = $N; | |
| 27 | while ($n > 1) {
| |
| 28 | @a[0, $n - 1] = @a[$n - 1, 0]; | |
| 29 | --$n; | |
| 30 | pushDown(0, $n); | |
| 31 | } | |
| 32 | ||
| 33 | while (my ($id, $key) = each @a) {
| |
| 34 | die unless $id == $key; | |
| 35 | } |