最大堆的插入和删除

本文介绍了最大堆的数据结构实现,包括创建、插入和删除最大元素等关键操作,并提供了具体的C语言代码示例。




typedef struct HeapStruct *MaxHeap; //最大堆的创建 
struct HeapStruct{
	ElementType *Elements;//存储堆元素的数组 
	int Size;//堆的当前元素个数
	int Capacity;//堆的最大容量 
};
MaxHeap Create(int MaxSize)
{//创建容量为MaxSize的空的最大堆 
	MaxHeap H=malloc(sizeof(struct HeapStruct));
	H->Elements=malloc((MaxSize+1)*sizeof(ElementType));
	H->Size=0;
	H->Capacity=MaxSize;
	H->Elements[0]=MaxData;
	//定义"哨兵"为大于堆中所有可能元素的值,便于以后更快操作
	return H; 
}
void Insert(MaxHeap H,ElementType item)//插入 
{//将元素item插入最大堆H,其中H->Elements[0]已经定义为哨兵 
	int i;
	if(IsFull(H)){
		printf("最大堆已满");
		return; 
	}
	i=++H->Size;//i指向插入后堆中的最后一个元素的位置
	for( ;H->Elements[i/2]<item;i/=2)
		H->Elements[i]=H->Elements[i/2];//向下过滤结点
	H->Elements[i]=item;//将item插入 
} //T(N)=O(logN) 
ElementType DeleteMax(MaxHeap H)//删除 
{//从最大堆H中取出键值为最大的元素,并删除一个结点 
	int Parent,Child;
	ElementType MaxItem,temp;
	if(IsEmpty(H)){
		printf("最大堆已为空");
		return;
	} 
	MaxItem=H->Elements[1];//取出根结点最大值
	//用最大堆中最后一个元素从根结点开始向上过滤下层结点
	temp=H->Elements[H->Size--];
	for(Parent=1;Parent*2<=H->Size;Parent=Child){
		Child=Parent*2;
		if((Child!=H->Size)&&
		   (H->Elements[Child]<H->Elements[Child+1]))
			Child++;//Child指向左右子结点的较大者
		if(temp>=H->Elements[Child]) break;
		else//移动temp元素到下一层
			H->Elements[Parent]=H->Elements[Child]; 
	}
	H->Elements[Parent]=temp;
	return MaxItem;  
}//T(N)=O(logN)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值