#include<stdio.h>
#define N 1000
#define INF 999999999
struct node {
int size;//堆大小
int length;//数组长度
int num[N];
};
void MAX_HEAPIFY(struct node &H, int i) { //最大堆维护
int l = i * 2;//算出左孩子的下标
int r = i * 2 + 1;//算出右孩子的下标
int largest;
if(l <= H.size && H.num[l] > H.num[i])
largest = l;
else
largest = i;
if(r <= H.size && H.num[r] > H.num[largest])
largest = r;
if(largest != i) { //如果以i为根的堆,不是一个最大堆
int t=H.num[largest];
H.num[largest] = H.num[i];
H.num[i] = t;
MAX_HEAPIFY(H,largest);
}
}
//创建最大堆
void BUILD_MAX_HEAP(struct node &H) {
H.size = H.length;
for(int i = H.size / 2; i >= 1; i--)
MAX_HEAPIFY(H,i);
}
//抽取最大值
bool HEAP_EXTRACT_MAX(struct node &H, int &max){
if(H.size < 1)
return false;
max = H.num[1];
H.num[1] = H.num[H.size];
H.size--;
MAX_HEAPIFY(H,1);
return true;
}
//更改值
bool HEAP_INCREASE_KEY(struct node &H, int i, int key){
if(key < H.num[i])
return false;
H.num[i] = key;
while(i>1 && H.num[i/2] < H.num[i]){
int t = H.num[i/2];
H.num[i/2] = H.num[i];
H.num[i] = t;
i=i/2;
}
return true;
}
//插入新元素
bool MAX_HEAP_INSERT(struct node &H, int key){
H.size++;
H.num[H.size] = -INF;
return HEAP_INCREASE_KEY(H,H.size,key);
}
int main() {
struct node H;
H.length = 10;
// 16 4 10 14 7 9 3 2 8 1
H.num[0] = INF;
for(int i=1; i <= H.length; i++) {
scanf("%d",&H.num[i]);
}
BUILD_MAX_HEAP(H);
for(int i=1; i <= H.length; i++){
printf("%d ",H.num[i]);
}
printf("\n");
MAX_HEAP_INSERT(H,20);
for(int i=1; i <= H.length; i++){
printf("%d ",H.num[i]);
}
printf("\n");
HEAP_INCREASE_KEY(H,5,19);
for(int i=1; i <= H.length; i++){
printf("%d ",H.num[i]);
}
printf("\n");
}
09-05