堆 是一种特殊的彻底二叉树结构,一般,它有两种类型:最小堆 和 最大堆。算法
最小堆(min heap)是父节点的值恒小于等于子节点的值。
数组
最大堆(max heap)是父节点的值恒大于等于子节点的值。 微信
任意节点小于(或大于)它的全部子节点,最小值(或最大值)在堆的根上。
堆老是一棵彻底树。即除了最底层,其余层的节点都被元素填满,且最底层尽量地从左到右填入。cdn
堆的存储结构blog
堆通常能够用数组的方式来存储,数组的顺序其实就是堆层级遍历的结果。排序
堆的插入it
因为堆是一个彻底二叉树,每次老是先填满上一层,再在下一层从左往右依次插入。io
插入步骤:
1.首先将新元素增长到堆的末尾。
2.而后在新元素与其父节点的值比较,若是新元素小于父节点的值则将二者交换位置。
3.不断进行第2步操做,直到不须要交换元素,或者达到堆顶。class
最后就会获得一个最小堆,上面交换元素的过程叫作上滤。二叉树
堆的删除
堆的删除和插入操做是刚刚相反的,插入是从下往上调整堆,删除是从上往下调整堆。
删除步骤:
1.首先删除堆顶元素。
2.而后在比较左右子节点,将小的元素上调。
3.不断进行步骤2,直到不须要调整或者调整到堆底了。
上面交换元素的过程叫作下滤。
堆有两种类型,最大堆和最小堆,而且堆老是一颗彻底树。
因为堆的 父节点的值恒小于等于子节点的值 或者 父节点的值恒大于等于子节点的值,能够做为 Top n 使用。
堆(一般是二叉堆)经常使用于排序。这种算法称做堆排序。
PS:
清山绿水始于尘,博学多识贵于勤。
我有酒,你有故事吗?
微信公众号:「清尘闲聊」。
欢迎一块儿谈天说地,聊代码。