Heapsort:为什么在索引n / 2-1的第2到最后一级的最右边节点?

时间:2016-12-31 07:06:20

标签: algorithm tree heapsort binary-heap

我正在研究用于堆排序的BST树。

int main(void) {
 8000280:   b480        push    {r7}
 8000282:   b085        sub sp, #20
 8000284:   af00        add r7, sp, #0
    uint32_t a, b, c;

    a = 1;
 8000286:   2301        movs    r3, #1
 8000288:   60fb        str r3, [r7, #12]
    b = 1;
 800028a:   2301        movs    r3, #1
 800028c:   60bb        str r3, [r7, #8]
    c = a+b;
 800028e:   68fa        ldr r2, [r7, #12]
 8000290:   68bb        ldr r3, [r7, #8]
 8000292:   4413        add r3, r2
 8000294:   607b        str r3, [r7, #4]

    while (1) ;
 8000296:   e7fe        b.n 8000296 <main+0x16>

它表明,树的第二个最后一级索引的最右边节点总是 n / 2-1

Max-Heape

请有人能告诉我简单的数学证明。谢谢

2 个答案:

答案 0 :(得分:2)

  

为什么索引为n/2-1的第二个到最后一个级别的最右边节点?

它不是。 heapify算法从堆中具有子节点的第一个节点开始。因此,在示例堆中,heapify算法从标记为17的节点开始。

假设从零开始的索引(意味着根节点在索引0处),i节点的父节点为(i-1)/2。因此,如果传递给函数的n是节点数,那么最后一个节点的索引是n-1,而最后一个节点((n-1)-1)/2的父节点与{相同} {1}}。

答案 1 :(得分:1)

  

它表明,树的第二个最后一级索引的最右边节点总是n / 2-1。

我同意user3386109的正确答案,但事实并非如此。从那时起,该答案的焦点就是您要打印的索引的含义。在这个答案中,我将重点关注倒数第二行中最后一个元素的索引(这是你明确要求的)。

假设节点和级别的基于0的索引,级别 i 的最后一个节点位于索引 2 i + 1 - 2 (这是从几何和的表达式得出的)。因此,级别0的最后一个索引为0,级别1的最后一个索引为2,级别2的最后一个索引为6,依此类推。

现在假设树具有 i 完整级别,以及最后一级的其他 j 节点。节点的总数是 n = 2 i + 1 - 2 + j 。采用base-2 log并向下舍入得到 i + 1 。结合之前的表达式,这给出了最终答案

2 ⌊log(n)⌋ - 2

以下是一些例子:

  • 对于 n = 1 ,倒数第二级未定义。

  • 对于 n = 2,3 ,向下舍入的日志为1,答案为0。

  • 对于 n = 4,5,6,7 ,向下舍入的日志为2,答案为2。