```#!/usr/local/bin/perl
# \$Id: heapsort.perl,v 1.11 2001/05/08 02:46:59 doug Exp \$
# http://www.bagley.org/~doug/shootout/
# Matt Harris suggested passing the array via typeglob

use strict;

use constant IM => 139968;
use constant IA =>   3877;
use constant IC =>  29573;

use vars qw(@ra);

my \$LAST = 42;
sub gen_random { (\$_[0] * (\$LAST = (\$LAST * IA + IC) % IM)) / IM }

sub heapsort (\$\@) {
my \$n = shift;
# use typeglob ra to refer to array.
local *ra = shift;

my(\$rra, \$i, \$j);

my \$l = (\$n >> 1) + 1;
my \$ir = \$n;
while (1) {
if (\$l > 1) {
\$rra = \$ra[--\$l];
} else {
\$rra = \$ra[\$ir];
# print('ir=1  ', \$ir, ' <- ', 1, ' (', sprintf("%.10g", \$ra[1]), ')', "\n" );
\$ra[\$ir] = \$ra[1];
if (--\$ir == 1) {
# print('1=rra ', 1, ' <- ', sprintf("%.10g", \$rra), "\n" );
\$ra[1] = \$rra;
return;
}
}
\$i = \$l;
\$j = \$l << 1;
# print "      l=\$l i=\$i j=\$j ir=\$ir\n";
while (\$j <= \$ir) {
\$j++ if ((\$j < \$ir) && (\$ra[\$j] < \$ra[\$j+1]));
# print("      in2while, j=\$j rra=", sprintf("%.10g", \$rra), ' ra(j)=', sprintf("%.10g", \$ra[\$j]), "\n");
if (\$rra < \$ra[\$j]) {
# print('i=j   ', \$i, ' <- ', \$j, ' (', sprintf("%.10g", \$ra[\$j]), ')', "\n" );
\$ra[\$i] = \$ra[\$j];
\$j += (\$i = \$j);
} else {
\$j = \$ir + 1;
}
}
# print('i=rra ', \$i, ' <- ', sprintf("%.10g", \$rra), "\n" );
\$ra[\$i] = \$rra;
}
}

my \$N = \$ARGV[0];
\$N = 1 if (\$N < 1);

# create an array of N random doubles
my @ary = ();
for (my \$i=1; \$i<=\$N; \$i++) {
\$ary[\$i] = gen_random(1.0);
}

heapsort(\$N, @ary);

printf("%.10g\n", \$ary[-1]);

```