[堆排序之番外] heap-size[A]的理解


前言
自己在看《算法导论》的时候,对 heap-size[A]理解不清楚,也影响了看下去的心情(逃,碰到问题就不想看了...
在看完了整个算法,写过代码以后,才算是理解了些。下面写下自己的理解。

正文
《算法导论》中的对 heap-size[A]的描述是:

表示堆的数组 A是一个具有两个属性的对象: length[A]是数组中的元素个数, heap-size[A]是存放在 A中的堆的元素个数。

相应的英文原文是: heap-size[A]  represents how many elements in the heap are stored within  array  A.

《算法导论》后面接着解释:虽然A[1...length[A]]中都可以包含有效值,但A[heap-size[A]]之后的元素都不属于相应的堆,此处heap-size[A] <= length[A]

相应的英文原文是:  although A[1...length[A]] may contain numbers, only the elements in A[1...heapsize[A]] , where 0 <= heap-size[A] <= length[A], are valid elements of the heap.

这么说可能还不是很直观,下面看几张图解。

1、建初始堆,heap-size[A]赋得初值:length[A]


初始堆建完后,堆的长度和序列的长度相等,即序列中的每个元素都是堆的元素。

例:序列 {16,7,3,20,17,8},建初始堆后如下图


heap-size[A] = length[A] = 6

2、堆排序过程中, heap-size[A] = heap-size[A] - 1



例:图(a)是建立好的初始堆,交换A[1]和A[i]后,heap-size[A]-1,图(b)中只有浅色圆圈中的数属于堆(16不属于堆),显然,heap-size[A] < length[A]


完整的排序图解:




直至最后堆的长度变为1。

3、在堆调整中,用于判断,防止当前结点 i 的左(右)孩子不存在


例:序列 {16, 7, 3, 20, 17, 8}, 根据该序列元素构建一个完全二叉树

然后需要构造初始堆,则从最后一个非叶节点开始调整
LEFT[i] = 6
RIGHT[i] = 7(不存在)
heap-size[A] = 6(初始堆时,堆长度为序列长度)


写在后面
(1)结合代码看更直观,传送门: [堆排序之三] 实践,C++实现
(2)英文版《算法导论》中用的符号是A.length和A.heapsize,感觉更合适啊,翻译时怎么改了;
(3)吐槽下翻译,英文的更通俗易懂些;
(4)这算是真正意义上的第一篇原创。




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值