;;; -*- mode: lisp -*-
;;; $Id: heapsort.poplisp,v 1.0 2002/05/03 13:48:00 dada Exp $
(defconstant IM 139968)
(defconstant IA 3877)
(defconstant IC 29573)
(defvar LAST 42)
(defun gen_random (max)
(declare (optimize (speed 3) (debug 0) (safety 0)))
(declare (type (signed-byte 32) IM IA IC LAST))
(declare (double-float max))
(setq LAST (mod (+ (* LAST IA) IC) IM))
(/ (* max LAST) IM))
(defun heapsort (n ra)
(declare (optimize (speed 3) (debug 0) (safety 0)))
(let ((ir n)
(l (+ (ash n -1) 1))
(i 0)
(j 0)
(rra 0.0d0))
(declare (type (simple-array double-float (*)) ra))
(declare (fixnum ir l i j))
(declare (double-float rra))
(block here
(loop
(cond ((> l 1)
(setq rra (aref ra (setq l (- l 1)))))
(t
(setq rra (aref ra ir))
(setf (aref ra ir) (aref ra 1))
(setq ir (- ir 1))
(if (= ir 1)
(progn
(setf (aref ra 1) rra)
(return-from here nil)))))
(setq i l)
(setq j (ash l 1))
(do ()
((> j ir))
(cond ((and (< j ir) (< (aref ra j) (aref ra (+ j 1))))
(setq j (+ j 1))))
(cond ((< rra (aref ra j))
(setf (aref ra i) (aref ra j))
(setq j (+ j (the fixnum (setq i j)))))
(t
(setq j (+ ir 1)))))
(setf (aref ra i) rra)))))
(declare (optimize (speed 3) (debug 0) (safety 0)))
(let* ((n (parse-integer (or (car pop11::poparglist) "1")))
(ary (make-array (1+ n) :element-type 'double-float)))
(declare (fixnum n))
(loop for i fixnum from 0 below n do
(setf (aref ary i) (gen_random 1.0d0)))
(heapsort n ary)
(format t "~,10K~%" (aref ary n)))