原理
这里我们建立的是最大堆,用完全二叉树来表示这个堆;
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;