注意:
(1)大顶堆:子树中,父节点>两个子结点;两个子结点顺序没有要求。
大顶堆对应升序排序(数字大的放在后面)
(2)小顶堆:子树中,父节点<两个子结点;对应降序排序
(3)使用二叉树的思想,但实际是在操作数组
public class HeapSort {
public static void main(String[] args) {
int arr[] = {4, 6, 8, 5, 9, 10, 2, -10};
heapSort(arr);
}
//升序排列,大顶堆
public static void heapSort(int arr[]) {
//确保每个子树中,父节点最大
int i = arr.length / 2 - 1;//第一次排序针对第一个非叶子结点
while (i >= 0) {
adjust(arr, i, arr.length);
i--;//左,右子树都需要排序
}
System.out.println(Arrays.toString(arr));
// 将数组形成有序数组
int temp;
for (int j = arr.length - 1; j > 0; j--) {//j数组的最后一位
temp = arr[j];
arr[j] = arr[0];
arr[0] = temp;
adjust(arr, 0, j);//对剩下数组再