% Copyright The Numerical Algorithms Group Limited 1992-94. All rights reserved.
% !! DO NOT MODIFY THIS FILE BY HAND !! Created by ht.awk.
\newcommand{\HeapXmpTitle}{Heap}
\newcommand{\HeapXmpNumber}{9.36}
%
% =====================================================================
\begin{page}{HeapXmpPage}{9.36 Heap}
% =====================================================================
\beginscroll

%
%
%
%
%


The domain \spadtype{Heap(S)} implements a priority queue of
objects of type \spad{S} such that
%-% \HDindex{priority queue}{HeapXmpPage}{9.36}{Heap}
the operation \spadfunX{extract} removes and returns
the maximum element.
%-% \HDindex{heap}{HeapXmpPage}{9.36}{Heap}
The implementation represents heaps as flexible arrays
(see \downlink{`FlexibleArray'}{FlexibleArrayXmpPage}\ignore{FlexibleArray}).
The representation and algorithms give complexity
of \texht{$O(\log(n))$}{O(log n)} for insertion and extractions,
and \texht{$O(n)$}{O(n)} for construction.

\xtc{
Create a heap of six elements.
}{
\spadpaste{h := heap [-4,9,11,2,7,-7]\bound{h}}
}
\xtc{
Use \spadfunX{insert} to add an element.
}{
\spadpaste{insert!(3,h)\bound{h1}\free{h}}
}
\xtc{
The operation \spadfunX{extract} removes and returns
the maximum element.
}{
\spadpaste{extract! h\bound{h2}\free{h1}}
}
\xtc{
The internal structure of \spad{h} has been
appropriately adjusted.
}{
\spadpaste{h\free{h2}}
}
\xtc{
Now \spadfunX{extract} elements repeatedly
until none are left, collecting the elements in a list.
}{
\spadpaste{[extract!(h) while not empty?(h)]\bound{h2}}
}
\xtc{
Another way to produce the same result is by defining
a \userfun{heapsort} function.
}{
\spadpaste{heapsort(x) == (empty? x => []; cons(extract!(x),heapsort x))\bound{f}}
}
\xtc{
Create another sample heap.
}{
\spadpaste{h1 := heap [17,-4,9,-11,2,7,-7]\bound{h1}}
}
\xtc{
Apply \spadfun{heapsort} to present elements in order.
}{
\spadpaste{heapsort h1\free{f}}
}
\endscroll
\autobuttons
\end{page}
%
