# -*- mode: icon -*- # $Id: heapsort.icon,v 1.1 2001/05/08 02:46:59 doug Exp $ # http://www.bagley.org/~doug/shootout/ $define IM 139968 $define IA 3877 $define IC 29573 procedure gen_random(max) static LAST; initial LAST := 42; repeat { suspend((max * (LAST := (LAST * IA + IC) % IM)) / IM) } end procedure heapsort(n, ra) local l, j, ir, i, rra l := ishift(n, -1) + 1 ir := n repeat { if (l > 1) then { l := l - 1 rra := ra[l] } else { rra := ra[ir] ra[ir] := ra[1] ir := ir - 1 if (ir == 1) then { ra[1] := rra return } } i := l j := ishift(l, 1) while (j <= ir) do { if ((j < ir) & (ra[j] < ra[j+1])) then { j := j + 1 } if (rra < ra[j]) then { ra[i] := ra[j] i := j j := j + i } else { j := ir + 1 } } ra[i] := rra } end procedure main(argv) n := argv[1] | 1 ary := list(n) every i := 1 to n do ary[i] := gen_random(1.0) heapsort(n, ary) write(ary[n]) end