建立最大堆

建立最大堆与删除最大堆根节点算法类似,都需要依次下滤父结点。

typedef struct HNode *Heap;
struct HNode
{
	int *Data;//存储元素的数组;
	int size;
	int capacity;
};
typedef Heap MaxHeap;
typedef Heap MinHeap;
#define MAXDATA 1000

MaxHeap CreatHeap(int MaxSize)
{
	
	MaxHeap H=(MaxHeap)malloc(sizeof(struct HNode);
	H->Data=(int *)malloc((MaxSize+1)*sizeof(int));
	H->size=0;
	H->capacity=MaxSize;
	H->Data[0]=MAXDATA;//哨兵元素;
	return H;
}

bool isFull(MaxHeap H)
{
	return (H->size==H->capacity);
}
bool Insert(MaxHeap H,int X)
{//插入X;
	int father,son;
	if(isFull(H)
	{
		printf("full");
		return false;
	}
	i=++H->size;	
	for(;H->Data[i/2]<X;i/=2)
		H->Data[i]=H->Data[i/2];
	H->Data[i]=X;
	return true;
}
int DeleteMax(MaxHeap H)
{
	//删除最大值,
	int father,son;
	int X=H->Data[H->size--];
	Max=H->Data[1];
	for(father=1;(father*2)<H->size;father=son)
	{
		son=father*2;
		for((son!=H->size)&&H->Data[son]<H->Data[son+1])
			son++;
		if(H->Data[son]<=X) break;
		else
			H->Data[father]=H->Data[son];
	}
	H->Data[father]=X;
	return Max;
}

//建立最大堆
void PercDown(MaxHeap H,int p)
{
	int father,son;
	int X=H->Data[p];
	for(father=H->Data[p];(father*2)<H->size;father=son)
	{
		son=father*2;
		if((son!=H->size)&&H->Data[son]<H->Data[son+1])
			son++;
		if(X>=H->Data[son])
			break;
		else
			H->Data[father]=H->Data[son];
		}
	H->Data[father]=X;
}
void BuildHeap(MaxHeap H)
{
	int i;
	//从最后一个元素父结点开始,依次建堆
	for(i=H->size/2;i>0;i--)//注意这里,是大于0,不是大于1,需要依次将元素下滤
		PercDown(H,i);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值