Algorithm - 数据结构 - Heap(BinaryHeap)

堆 (二叉堆)

简介:

堆是特殊的一种树, 是一颗近似?完全二叉树

一般来说是用顺序结构进行存储

(二叉树是使用链表来进行存储的)

二叉堆分为大顶堆和小顶堆

定义

1. 是一颗完全二叉树

2. 堆中的任何一个父节点的值都大于(小于)或等于它左右孩子的节点值

public class BinaryHeap {

   /**上浮操作,对插入的节点进行上浮
    *
    * @param arr
    * @param length :表示二叉堆的长度
    */
   public static int[] upAdjust(int arr[], int length){
       //标记插入的节点
       int child = length - 1;
       //其父亲节点
       int parent = (child - 1)/2;
       //把插入的节点临时保存起来
       int temp = arr[child];

       //进行上浮
       while (child > 0 && temp < arr[parent]) {
           //其实不用进行每次都进行交换,单向赋值就可以了
           //当temp找到正确的位置之后,我们再把temp的值赋给这个节点
           arr[child] = arr[parent];
           child = parent;
           parent = (child - 1) / 2;
       }
       //退出循环代表找到正确的位置
       arr[child] = temp;
       return arr;
   }

   /**

    */

   /**
    *  下沉操作,执行删除操作相当于把最后
    *  * 一个元素赋给根元素之后,然后对根元素执行下沉操作
    * @param arr
    * @param parent 要下沉元素的下标
    * @param length 数组长度
    */
   public static int[] downAdjust(int[] arr, int parent, int length) {
       //临时保证要下沉的元素
       int temp = arr[parent];
       //定位左孩子节点位置
       int child = 2 * parent + 1;
       //开始下沉
       while (child < length) {
           //如果右孩子节点比左孩子小,则定位到右孩子
           if (child + 1 < length && arr[child] > arr[child + 1]) {
               child++;
           }
           //如果父节点比孩子节点小或等于,则下沉结束
           if (temp <= arr[child])
               break;
           //单向赋值
           arr[parent] = arr[child];
           parent = child;
           child = 2 * parent + 1;
       }
       arr[parent] = temp;
       return arr;
   }

   /**
    * 构建操作
    *
    * @param arr
    */
   public static int[] buildHead(int[] arr,int length) {
       //从最后一个非叶子节点开始下沉
       for (int i = (length - 2) / 2; i >= 0; i--) {
           arr = downAdjust(arr, i, length);
       }
       return arr;
   }
}

 

操作

插入

删除

构建

 

 

参考链接:

https://mp.weixin.qq.com/s?__biz=MzUxNzg0MDc1Mg==&mid=2247484201&idx=1&sn=9cbea904fbe08b85b6aeb54a8ea7d7bb&chksm=f9934936cee4c0202cac39df919bce12f1501e2fc211551806254a7a7f4fe1360913415594a1&scene=21#wechat_redirect

 

posted @ 2018-10-16 21:17  `Laimic  阅读(250)  评论(0)    收藏  举报