MOOC 5.1 堆

// 最大堆的操作
// 最大堆的创建
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插入 */ 
}

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;
}

  

posted @ 2019-09-16 21:20  青衫客36  阅读(129)  评论(0编辑  收藏  举报