堆排序的堆是怎么建立的?

看了堆排序的概念,但是还是不是很清楚。概念上说,每次都先建堆,然后形成完全二叉树,然后提出最大的根节点,重新建堆。不过我对完全二叉树的概念不是很清楚。还有这个建堆到底是根... 看了堆排序的概念,但是还是不是很清楚。
概念上说,每次都先建堆,然后形成完全二叉树,然后提出最大的根节点,重新建堆。
不过我对完全二叉树的概念不是很清楚。还有这个建堆到底是根据什么建的,没明白,还请指教。
展开
 我来答
Go浪人生
2012-07-04 · TA获得超过2472个赞
知道小有建树答主
回答量:738
采纳率:100%
帮助的人:909万
展开全部
堆排序,也叫二叉堆排序。
完全二叉树:
1、左右子树的节点数满足 Ln/Rn=1
2、左右子树高度满足 Rh+1>=Lh>=Rh
3、子节点值统一比父节点大(小)。

最大堆:2叉树的所有子节点都比父节点小。所以根节点是最大的。
最小堆:2叉树的所有子节点都比父节点大。所以根节点是最小的。

建堆:假设最多有N个数据。开辟一段用来存这N个数据的空间。根节点位置为0。其子节点位置为1、2。所有子节点位置与父节点的位置(k)关系:k,2k+1,2k+2。 假设已经有了n个数据,那么新数据自然放在n位(因为位置是从0开始),定义一个函数 shift_up() 用来调整新数据。它的功能是:将新数据与 (n-1)/2 位置的数据(新数据的父节点)比较,如果比父节点大,那么就交换,继续比较,直到它比父节点小。

重新建堆: 当取数据时,就是将根节点取出来。因为根节点是最大的,所以自然还要将其所有子节点进行调整,以保证剩下的数据的根节点是最大的。方法是:将最后一个数放到根节点位置(因为根节点取出后,根节点就空了),然后调用 shift_down()函数将其与1、2位置的数比较,如果比它大,则交换,然后继续与2k+1,2k+2位置的比较,直到这两个位置的数都比它小。
逸明鲸人
2012-07-03 · TA获得超过867个赞
知道小有建树答主
回答量:409
采纳率:100%
帮助的人:436万
展开全部
先将元素按顺序插入数组 形成完全二叉树 然后按照定义对二叉树内元素即数组元素进行调整 初始化堆 使数组内元素满足 (以小根堆为例)a[x]<=a[x*2]且a[x]<=a[x*2+1] 如有什么不懂得 还可以问我
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
NBA周报
2012-07-03 · TA获得超过203个赞
知道小有建树答主
回答量:274
采纳率:0%
帮助的人:152万
展开全部
根据堆的概念,使用一维数组即可建立,关键在于建立堆得算法
追问
请教一下,我关键就是想问,堆排序的堆是怎么建立的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2012-07-03
展开全部
堆排序确实比较难理解,不知你用的是哪本书?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式