% $Id: heapsort.slang,v 1.0 2003/01/03 14:39:00 dada Exp $
% http://dada.perl.it/shootout/
%
% contributed by John E. Davis
variable IM = 139968;
variable IA = 3877;
variable IC = 29573;
variable LAST = 42;
define gen_random(max)
{
LAST = (LAST * IA + IC) mod IM;
return (max * LAST) / IM;
}
define heapsort(n, ra)
{
variable rra = 0, i = 0, j = 0;
variable l = (n shr 1) + 1;
variable ir = n;
forever
{
if (l > 1)
{
l--;
rra = ra[l];
}
else
{
rra = ra[ir];
ra[ir] = ra[1];
ir--;
if (ir == 1)
{
ra[1] = rra;
return;
}
}
i = l;
j = mul2(l);
while (j <= ir)
{
variable raj = ra[j];
if (j < ir)
{
variable raj1 = ra[j+1];
if (raj < raj1)
{
j++;
raj=raj1;
}
}
#iffalse
if (rra < raj)
{
ra[i] = raj;
i = j;
j = mul2 (j);
continue;
}
j = ir + 1;
#else
if (rra >= raj)
{
j = ir + 1;
break;
}
ra[i] = raj;
i = j;
j = mul2 (j);
#endif
}
ra[i] = rra;
}
}
define main()
{
variable N = integer (__argv[1]);
if (N < 1)
N = 1;
variable ary = array_map (Double_Type, &gen_random, [0:N]*0+1.0);
heapsort(N, ary);
vmessage ("%.10f", ary[N]);
}
main();