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