我正在尝试实现算法手册here中给出的最大堆化算法 书中的算法是
MAX-HEAPIFY(A,i)
1 l<-LEFT(i)
2 r<-RIGHT(i)
3 if l<=heap-size[A] and A[l]>A[i]
4 then largest<--l
5 else largest<--i
6 if r<=heap-size[A] and A[r]>A[largest]
7 then largest <->r
8 if largest!=i
9 then exchange A[i]<->A[largest]
10 MAX-HEAPIFY(A,largest)
我的问题是我的数组从Zero开始。在书中他们假设如果父母的索引是i,那么左子是2i而右子是2i + 1但是当他们的索引从1开始时。 case它是零所以我应该如何计算左右孩子的索引?
答案 0 :(得分:5)
左边的孩子是2i + 1,右边的孩子是2(i + 1)= 2i + 2.
你可以通过调用你的一个索引j来证明这是正确的,定义i = j - 1并观察
j = i + 1
left + 1 = 2j = 2(i+1) = 2i+2
right + 1 = 2j+1 = 2(i+1) + 1
所以
left = 2i+1
right = 2(i+1)
(您还可以通过分配单个元素来省去一些麻烦。)