考研数据结构----MaxHeap

原理

这里我们建立的是最大堆,用完全二叉树来表示这个堆;
1. 堆顶比两棵子树中的任何元素都要大;
2. 每棵子树同样满足这个条件;
即根是树中最大值,每棵子树的根是子树中的最大值
所以我们在构造的时候要先从最小的子树开始构造,这样才能构造更大的子树

/*
*   建立大顶堆,a[1]为最大元素 
*/
typedef struct {
    /*自底向上调整每一个元素,每次构造一个子结构*/ 
    void buildMaxHeap(int a[], int len) {
        for (int i = len / 2; i >= 1;--i)
            AjustDown(a, i, len);
    }
    /*将第k个元素向下调整*/ 
    void AjustDown(int a[], int k, int len) {
        int temp = a[k];
        for (int i = 2*k;i <= len;i *= 2) {
            if (i < len && a[i] < a[i+1]) ++i;
            if (temp >= a[i]) break;
            a[k] = a[i];
            k = i;
        }
        a[k] = temp;
    }
    /*把第k个元素向上调整*/
    void AjustUp(int a[], int k) {
        int temp = a[k];
        int i = k / 2;
        while(i >= 1 && a[i] < temp) {
            a[k] = a[i];
            k = i;
            i /= 2;
        }
        a[k] = temp;
    }
    /*插入元素*/
    void InsertElement(int a[], int& len, int value) {
        a[++len] = value;
        AjustUp(a, len);
    }
    /*删除第k个元素*/
    int DeleteElement(int a[], int& len, int k) {
        int temp = a[k];
        a[len] = a[k];
        AjustDown(a, k, --len);
        return temp;
    }
}MaxHeap;

猜你喜欢

转载自blog.csdn.net/KIJamesQi/article/details/75903217
今日推荐