/**
* 堆排序。
* @author Bright Lee
*/
public class HeapSort {
public static void sort(int[] array) {
// 调整所有子堆为大顶堆:
for (int i = array.length / 2 - 1; i >= 0; i--) {
adjust(array, i, array.length);
}
// 建堆完毕,开始排序:
for (int j = array.length - 1; j > 0; j--) {
swap(array, 0, j);
adjust(array, 0, j);
}
}
/**
* 调整堆为大顶堆。
*/
private static void adjust(int[] array, int i, int j) {
// 先把当前元素取出来,因为当前元素可能要一直移动
for (int k = 2 * i + 1; k < j; k = 2 * k + 1) {
// 父节点的值:
int temp = array[i];
// 让k先指向左右子节点中值最大的节点
if (k + 1 < j && array[k] < array[k + 1]) {
k++;
}
// 如果发现子节点更大,则进行值的交换
if (array[k] > temp) {
swap(array, i, k);
}
// 循环调整子树:
i = k;
}
}
private static void swap(int[] array, int i, int j) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
public static void main(String[] args) {
int[] array = new int[] { 13, 2, 29, 11, 80, 1, 12, 11, 55, 15, 17, 22 };
sort(array);
for (int i = 0; i < array.length; i++) {
int a = array[i];
System.out.print(a + ", ");
}
}
}