public classHeap {//This class should not be instantiated.
privateHeap() { }public static voidsort(Comparable[] pq) {int n =pq.length;//heapify phase
//从第一个非叶子节点开始对堆排序,执行完,这样堆就是有序的了
for (int k = n/2; k >= 1; k--)
sink(pq, k, n);//sortdown phase
int k =n;while (k > 1) {
exch(pq,1, k--);
sink(pq,1, k);
}
}/***************************************************************************
* Helper functions to restore the heap invariant.
***************************************************************************/
private static void sink(Comparable[] pq, int k, intn) {while (2*k <=n) {int j = 2*k;if (j < n && less(pq, j, j+1)) j++;if (!less(pq, k, j)) break;
exch(pq, k, j);
k=j;
}
}/***************************************************************************
* Helper functions for comparisons and swaps.
* Indices are "off-by-one" to support 1-based indexing.
***************************************************************************/
private static boolean less(Comparable[] pq, int i, intj) {return pq[i-1].compareTo(pq[j-1]) < 0;
}private static void exch(Object[] pq, int i, intj) {
Object swap= pq[i-1];
pq[i-1] = pq[j-1];
pq[j-1] =swap;
}//print array to standard output
private static voidshow(Comparable[] a) {for (int i = 0; i < a.length; i++) {
StdOut.println(a[i]);
}
}/*** Reads in a sequence of strings from standard input; heapsorts them;
* and prints them to standard output in ascending order.
*
*@paramargs the command-line arguments*/
public static voidmain(String[] args) {
String[] a=StdIn.readAllStrings();
Heap.sort(a);
show(a);
}
}