前言
自己在看《算法导论》的时候,对
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)这算是真正意义上的第一篇原创。