Heap 的原理与实现

文章目录

原理

        堆是一种数状数据结构,若是满足以下特性,即可称为堆:“给定堆中任意节点 P 和 C,若 P 是 C 的母节点,那么 P 的值会小于等于(或大于等于) C 的值”。若母节点的值恒小于等于子节点的值,此堆称为最小堆(min heap);反之,若母节点的值恒大于等于子节点的值,此堆称为最大堆(max heap)。在堆中最顶端的那一个节点,称作根节点(root node),根节点本身没有母节点(parent node)。
        这里,我们主要讨论二叉堆。
存储结构
完全二叉树的顺寻存储结构

  • 逻辑定义
    n个元素序列{k1, k2… ki…kn},当且仅当满足下列关系时称之为堆:
    (ki <= k2i, ki <= k2i+1)或者(ki >= k2i, ki >= k2i+1), (i = 1, 2, 3, 4… n/2)

实现

void adjustDown(int a[], int size, int k) {
    int tmp = a[k];
    for (int i = 2 * k; i < size; i *= 2) {
        if (i + 1 < size && a[i] < a[i+1])
            i++;
        if (a[k] >= a[i]) break;
        else {
            a[k] = a[i];
            k = i;
        }
    }
    a[k] = tmp;
}

void adjustUp(int a[], int k) {
    int loc = k - 1;
    int tmp = a[loc];
    int i = loc / 2;
    while(i >= 0 && a[i] < tmp) {
        a[loc] = a[i];
        loc = i;
        i = loc / 2;
    }
    a[loc] = tmp;
}

void buildMaxHeap(int a[], int size) {
    for (int i = (size - 1) / 2; i >= 0; i--)
        adjustDown(a, size, i);
}

猜你喜欢

转载自blog.csdn.net/weixin_43758823/article/details/86766664