优先队列

#include
#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");
}

你可能感兴趣的:(优先队列,最大堆,数据结构,算法模板,算法导论)