堆:
1、完全二叉树
2、所有父节点 大于子节点
基础公式:
1、定位parent = (i - 1) /2
2、定位左侧节点 c1 = 2i +1
3、定位右侧节点 c2 = 2i +2

我们从 最开始的节点进行的heapify ,只能对单个完全二叉树节点进行堆调整 ,并不能对整个二叉树进行全面覆盖
/解决方案:从最底层的节点,倒着做heapify 就ok了/
�
观察一下特点:最后一个节点,然后针对 3 -> 2 -> 1 进行heapify
最后一个节点的parent节点 就是我们开始进行倒着做heapify的开始节点

排序,最后一个节点 与 第一个节点互换,最大的值,砍掉也就是不进行堆重构
1、将数据 堆化后
2、最后一个节点 与 第一个节点互换,最大的值,跑到了节点最后方(鉴定了顺序排序的结构)
3、重新 堆重构 heapify是从上至下的 ,每次砍掉的 最大值不进行堆的重构
1、堆重构(heapify) 递归
2、堆倒叙 heapify 创建完整堆结构(完整二叉树)for
3、首位互换,砍掉最后节点,重新堆重构 for
public class TestMain {public static void main(String[] args) {//结果: 10,5,3,4,1,2// int tree[] = {4,10,3,5,1,2};// int n = tree.length;// heapify(tree,n,0);/*现在代码不够完善,因为我们从 最开始的节点进行的heapify ,只能对单个完全二叉树节点进行堆调整 ,并不能对整个二叉树进行全面覆盖*//*解决方案:从最底层的节点,倒着做heapify 就ok了*/int tree[] = {4,10,3,5,1,2};int n = tree.length;//创建堆// heapify(tree,n,0);// buildHeap(tree,n);//堆的首个节点是最大的,那么 我们将位置 与 最后一个互换之后,剪出来,重新构建堆,然后重复执行heapSort(tree,n);Arrays.stream(tree).forEach(System.out::println);}public static void heapSort(int tree[],int n){//创建堆buildHeap(tree,n);for (int i = n - 1; i >=0 ; i--) {//最后一个节点 与 第一个节点更换,最大的值,跑到了节点最后方swap(tree,i,0);//因为heapify是从上至下的,并且i-- 所以,第一次是 最后一个节点 第二次是倒数两个节点 ,不进行堆的重构heapify(tree,i,0);}}/*** 创建完整的 【堆】* 树从最后一个节点开始倒叙做 heapify* @param tree 数组* @param n 数组长度*/public static void buildHeap(int tree[],int n){//节点的索引位置 n - 1.因为parent结果 就是索引位置int last_node = n - 1;int parent = (last_node - 1) / 2;for (int i = parent; i >= 0 ; i--) {heapify(tree,n,i);}}/**** 堆重构,顺序是从上至下* @param tree 数组* @param n 数组长度,防止越界* @param i 开始堆重构的父节点*/public static void heapify(int tree[],int n , int i){if(i >= n){return;}//获取两个节点 ;左侧节点 c1 = 2i +1int c1 = 2 * i + 1;int c2 = 2 * i + 2;//假定 i是最大值int max = i;// 判断是否越界,堆节点进行重构if(c1 < n && tree[c1] > tree[max]){//节点位置max = c1;}if(c2 < n && tree[c2] > tree[max]){max = c2;}//如果max 不是最初假定的i为最大值,那么代表 下方节点 大于当前节点if(max != i){//进行数据交换swap(tree,max,i);//递归 将树完全排序heapify(tree,n,max);}}/*** 上沉下浮 数据替换* @param tree 数组* @param max 最大值* @param i 需要交换的小值*/private static void swap(int[] tree, int max, int i) {//最大的值 临时存储int temp = tree[max];//数据上沉tree[max] = tree[i];//数据下浮tree[i] = temp;}}
