ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【学习笔记】堆

2022-02-17 12:33:56  阅读:141  来源: 互联网

标签:结点 堆顶 孩子 笔记 根堆 学习 插入 父亲


一.  概念

大根堆:父亲结点的值比孩子结点的值大,即越往上,值越大

小根堆:父亲结点的值比孩子结点的值小,即越往上,值越小

只能找到其中最大/最小的元素(即堆顶元素),不能找到第二大/第三大的元素,即兄弟结点之间没有大小之间的关系,只有父亲结点与孩子节点之间存在大小关系。换句话说,满足父亲与孩子结点之间存在大小关系的就是堆,不需要满足兄弟结点之间的关系。

堆是一颗完全二叉树,即用数组存储时是连续的,可以直接找到某一个结点的父亲/孩子结点。

二. 堆排序(以小根堆为例)

Step 1 :新建一个堆 (每次插入结点前的状态是小根堆,插入后也要保证是小根堆)

插入一个值为 $i$ 的结点:

把这个结点放在堆的最后。

让这个结点和他的父亲比较,如果比他父亲小,就和它父亲互换。

一直循环操作以上两步,直到这个结点比它父亲大为止。

这样操作的正确性:这个操作是一条链,所以如果保证这条链是从小到大的,那当前状态一定是小根堆

Step 2:每次弹出堆顶,删除堆顶,再把剩下的结点维护成小根堆。

现在主要的问题是怎么把剩下的结点维护成小根堆:

先把最后一个结点放到堆顶,不断调整堆。

具体调整步骤:让这个结点和他的左右孩子比较。比左右孩子都小,就说明现在这个状态就是小根堆,不用继续调整了;否则,选出左右孩子中较小的一个,把他和当前堆顶交换。

 

标签:结点,堆顶,孩子,笔记,根堆,学习,插入,父亲
来源: https://www.cnblogs.com/Jiayn/p/15904060.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有