/**
* Heap construction
* delMax() till empty
*/
public class HeapSort {
public void sort(Comparable[] pq) {
int N = pq.length;
for (int i = N / 2; i >= 1; i--) {
sink(pq, i, N);
}
while (N > 1) {
exch(pq, 1, N--);
sink(pq, 1, N);
}
}
private void exch(Comparable[] pq, int i, int j) {
Comparable temp = pq[i];
pq[i] = pq[j];
pq[j] = temp;
}
private void sink(Comparable[] pq, int i, int j) {
while (2 * i <= j) {
int k = 2 * i;
if (k < j && less(pq, k, k + 1)) k++;
if (!less(pq, i, k)) break;
exch(pq, i, k);
i = k;
}
}
private boolean less(Comparable[] pq, int i, int k) {
return pq[i].compareTo(pq[k]) < 0;
}
}