优先队列(堆)C++实现源码

本文介绍了堆的数据结构特性,强调最小元素位于根节点,并详细阐述了堆的插入和删除操作。堆的插入通过在末尾创建空节点并逐级上浮确保堆性质;删除则通过将最小元素的子节点中较小者提升至根节点,重复此过程,直至最后一个元素填充空位。提供的代码实现了这一逻辑。
摘要由CSDN通过智能技术生成

堆是一棵完全二叉树,最小元素在根结点上,任意子树也是一个堆。对于堆中的任意一个位置i上的元素,其左儿子在2i位置上,右儿子在2i+1位置上,它的父节点在 2/i 位置上。

堆的插入:

为了保持堆为完全二叉树,在堆的最后一个位置创建空结点,如果空结点的父节点大于要插入的结点,就将父节点移入空结点中,依此类推,直到要插入的结点能放入移空的位置中。

堆的删除(删除根结点,也就是最小的元素):

将根结点两个子结点中较小者提至根结点,再将那个较小的子节点的两个子节点的较小者提升,依此类推,直到将最后一个结点移入最近移空的结点中。

注:为了方便实现,堆的第一个元素是从1开始的,而非从0开始。

Heap.h

#include "Utility.h"

#define MinData (-32767)

struct HeapStruct
{
	int Capacity;
	int Size;
	int *Elements;
};

typedef struct HeapStruct *PriorityQueue;

PriorityQueue Initialize( int MaxElements)
{
	PriorityQueue H;

	H = (HeapStruct *)malloc(sizeof(HeapStruct));
	if( H == NULL )
		cout << "空间不足!" << endl;

	H->Elements = (int *)malloc( (MaxElements + 1) * sizeof(int) );
	if( H->Elem
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值