最大堆的操作集

包括最大堆的创建,删除,插入操作:
代码如下:

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
typedef struct HNode* Heap;//堆的类型定义
struct HNode{
	int *Data;//存储元素的数组 
	int Size;//堆中当前的元素数 
	int Capacity;//堆的最大容量 
}; 
typedef Heap MaxHeap;//最大堆
#define Inf 0x3f3f3f3f
#define ERROR -1 
MaxHeap CreatMaxHeap(int MaxSize){//创建容量为MaxSize的最大堆 
	MaxHeap H=(MaxHeap)malloc(sizeof(struct HNode));
	H->Data=(int*)malloc(sizeof(int));
	H->Size=0;
	H->Capacity=MaxSize;
	H->Data[0]=Inf;//定义哨兵为大于堆中的所有元素 
	return H;
} 
bool IsEmpty(MaxHeap H){
	return (H->Size==0);
}

bool IsFull(MaxHeap H){
	return (H->Size==H->Capacity); 
} 

void PercDown(MaxHeap H,int p){
	//下滤X:将H中以H->Data[p]为根的子堆调整为最大堆 
	int parent,child;
	int X;
	X=H->Data[p];//取出根节点存放的值 
	for(parent=p;parent*2<=H->Size;parent=child){
		child=parent*2;
		if(child!=H->Size&&(H->Data[child]<H->Data[child+1]))//说明有右孩子 
		child++;//child指向左右节点较大的一个 
		if(X>=H->Data[child]) break;//找到了合适位置 
		else //下滤X 
		H->Data[parent]=H->Data[child];
	}
	H->Data[parent]=X;
}
void BuildHeap(MaxHeap H){//建立最大堆 
	int i;
	for(i=H->Size/2;i>=1;i--)
	PercDown(H,i);
} 
int DeleteHeap(MaxHeap H){//最大堆的删除 
	int parent,child;
	int MaxItem,X;
	if(IsEmpty(H)){
		printf("最大堆已空\n");
		return ERROR;
	}
	MaxItem=H->Data[1];
	X=H->Data[H->Size--];
	for(parent=1;parent*2<=H->Size;parent=child){
		child=parent*2;
		if(child!=H->Size&&(H->Data[child]<H->Data[child+1]))//说明有右孩子 
		child++;//child指向左右节点较大的一个 
		if(X>=H->Data[child]) break;//找到了合适位置 
		else //下滤X 
		H->Data[parent]=H->Data[child];
	}
	H->Data[parent]=X;
	return MaxItem;
} 

bool Insert(MaxHeap H,int X){//最大堆的插入 
	int i;
	if(IsFull(H)){
		printf("最大堆已满\n");
		return false;
	}
	i=++H->Size;//i指向插入后堆的最后一个元素的位置
	for(;H->Data[i/2]<X;i/=2)
	H->Data[i]=H->Data[i/2];//上滤X
	H->Data[i]=X;
	return true; 
}
int main(){
	int maxsize,n;
	scanf("%d",&maxsize);
	MaxHeap L;
	L=CreatMaxHeap(maxsize);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	scanf("%d",&L->Data[i]);
	L->Size=n;
	BuildHeap(L);
	for(int i=1;i<=n;i++)
	printf("%d ",L->Data[i]);
	return 0;
} 

主函数是我随便测试的,可以根据题目要求不同进行相应的变化。

猜你喜欢

转载自blog.csdn.net/qq_41938789/article/details/84329449