public class Heap {
private Heap(){}
public static void sort(Comparable[] a){
int n = a.length;
for (int i = n/2; i >= 1; i--){
sink(a, i, n);
}
System.out.println(Arrays.toString(a));
while (n > 1) {
exch(a, 1, n--);
sink(a,1, n);
}
}
private static void sink(Comparable[] a, int k, int n){
while (2*k <= n){
int j = 2*k;
if (j < n - 1 && less(a, j, j+1)) j++;
if (less(a, j, k)) break;
exch(a, j, k);
k = j;
}
}
private static boolean less(Comparable[] a, int i, int j){
return a[i - 1].compareTo(a[j - 1]) < 0;
}
private static void exch(Object[] a, int i, int j){
Object temp = a[i - 1];
a[i - 1] = a[j - 1];
a[j - 1] = temp;
}
public static void main(String[] args) {
Comparable[] a = new Comparable[]{3,2,6,4,7,5};
sort(a);
System.out.println(Arrays.toString(a));
}
}