Sorting
Heap Sort
The binary heap data structure is a array data structure as a almost full binary tree. Here is a provided way to implement to compute the indices of the parent node, left, and right child
\begin{algorithm}
\caption{Parent}
\begin{algorithmic}
\PROCEDURE{Parent}{$i$}
\STATE{return $\lfloor(i / 2)\rfloor$}
\ENDPROCEDURE
\end{algorithmic}
\end{algorithm}
\begin{algorithm}
\caption{Left}
\begin{algorithmic}
\PROCEDURE{Left}{$i$}
\STATE{return $2i$}
\ENDPROCEDURE
\end{algorithmic}
\end{algorithm}
\begin{algorithm}
\caption{Right}
\begin{algorithmic}
\PROCEDURE{Right}{$i$}
\STATE{return $2i + 1$}
\ENDPROCEDURE
\end{algorithmic}
\end{algorithm}
There are two ways to implement the binary heaps, the max-heaps and min-heaps. Here we focus on the max-heap such that it obeys the max-heap property as follows
\[A[\text{Parent}(i)] \geq A[i]\]
The \(\textbf{Max-Heapify}\) running time is \(O(log \: n)\) logarthimic time, which maintains the max-heap property.
The \(\textbf{Build-Max-Heap}\) running time is \(O(n)\) linear time, builds a max-heap from an unordered input array.
The \(\textbf{HeapSort}\) running time is \(O(n \: log \: n)\) which sorts the array in place.
\begin{algorithm}
\caption{Max-Heapify}
\begin{algorithmic}
\PROCEDURE{Max-Heapify}{$A, i$}
\STATE{$l = $ \textsc{Left}$(i)$}
\STATE{$r = $ \textsc{Right}$(i)$}
\IF{$l \leq A$.heap-size and $A[l] > A[i]$}
\STATE{largest $= l$}
\ELSE
\STATE{largest $= i$}
\ENDIF
\IF{$r \leq A$.heap-size and $A[r] > A[largest]$}
\STATE{$largest = r$}
\ENDIF
\IF{$largest \neq i$}
\STATE{exchange $A[i]$ with $A[largest]$}
\STATE \CALL{Max-Heapify}{$A, largest$}
\ENDIF
\ENDPROCEDURE
\end{algorithmic}
\end{algorithm}
Building a heap
\begin{algorithm}
\caption{Build-Max-Heap}
\begin{algorithmic}
\PROCEDURE{Build-Max-Heap}{$A, n$}
\STATE{$A.$heap-size = $n$}
\FOR{ $i \gets \lfloor n / 2 \rfloor$ down to 1}
\STATE \CALL{Max-Heapify}{$A, i$}
\ENDFOR
\ENDPROCEDURE
\end{algorithmic}
\end{algorithm}