【学习笔记】堆
作者:互联网
一. 概念
大根堆:父亲结点的值比孩子结点的值大,即越往上,值越大
小根堆:父亲结点的值比孩子结点的值小,即越往上,值越小
堆只能找到其中最大/最小的元素(即堆顶元素),不能找到第二大/第三大的元素,即兄弟结点之间没有大小之间的关系,只有父亲结点与孩子节点之间存在大小关系。换句话说,满足父亲与孩子结点之间存在大小关系的就是堆,不需要满足兄弟结点之间的关系。
堆是一颗完全二叉树,即用数组存储时是连续的,可以直接找到某一个结点的父亲/孩子结点。
二. 堆排序(以小根堆为例)
Step 1 :新建一个堆 (每次插入结点前的状态是小根堆,插入后也要保证是小根堆)
插入一个值为 $i$ 的结点:
把这个结点放在堆的最后。
让这个结点和他的父亲比较,如果比他父亲小,就和它父亲互换。
一直循环操作以上两步,直到这个结点比它父亲大为止。
这样操作的正确性:这个操作是一条链,所以如果保证这条链是从小到大的,那当前状态一定是小根堆
Step 2:每次弹出堆顶,删除堆顶,再把剩下的结点维护成小根堆。
现在主要的问题是怎么把剩下的结点维护成小根堆:
先把最后一个结点放到堆顶,不断调整堆。
具体调整步骤:让这个结点和他的左右孩子比较。比左右孩子都小,就说明现在这个状态就是小根堆,不用继续调整了;否则,选出左右孩子中较小的一个,把他和当前堆顶交换。
标签:结点,堆顶,孩子,笔记,根堆,学习,插入,父亲 来源: https://www.cnblogs.com/Jiayn/p/15904060.html