1.将数组构建成大顶堆
2.取出最大元素,最后一个元素放到最大元素处
重复1、2
拿出的顺序就是从大到小的数组
public class heapSort {
public static int[] arr;
public static int len;
public static void main(String[] args) {
arr = new int[]{7, 10, 3, 5, 2, 6, 8};
len = arr.length;
heapSort();
for (int i = 0; i < len; i++) {
System.out.print(arr[i] + " ");
}
}
public static void heapSort() {
// 从下向上构造大顶堆
for (int i = (len - 2) / 2; i >= 0; i--) {
helper(i, len - 1);
}
// 不断取出大顶堆的定点
for (int i = len - 1; i >= 0; i--) {
int tmp = arr[0];
arr[0] = arr[i];
arr[i] = tmp;
helper(0, i - 1);
}
}
public static void helper(int low, int high) {
for (int i = low, j = 2 * i + 1; j <= high; j = 2 * j + 1) {
// 两个子节点找到更大的并与根节点比较交换,保证low->high满足大顶堆
// 找到子节点中更大的
if (j + 1 <= high && arr[j] < arr[j + 1]) {
j++;
}
// 使局部形成大顶堆
if (arr[i] < arr[j]) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
} else {
break;
}
i = j;
}
}
}