数据结构堆的实现(基于大堆)

该文详细介绍了堆数据结构的实现,包括堆的初始化、销毁、入堆操作(插入元素并调整)、出堆(删除堆顶元素并调整)、获取堆顶元素、判断堆是否为空以及堆的大小。同时,文中给出了向上调整和向下调整算法的代码实现。
摘要由CSDN通过智能技术生成

目录

1.堆的逻辑结构

1.1堆的初始化

1.2堆的销毁

1.3入堆

1.4出堆(堆的删除)

1.5堆顶元素

1.6堆是否为空的判定

1.7堆大小判断

1.8向上调整算法

1.9向下调整算法


数据结构堆的实现

1.堆的逻辑结构

typedef int HPDataType;
typedef struct Heap
{
	HPDataType* a;
	int size;
	int capacity;
}HP;

采用顺序结构存储方式

1.1堆的初始化

void HeapInit(HP* php)
{
	assert(php);
	php->a = (HPDataType*)malloc(sizeof(HPDataType) * 4);
	if (php->a == NULL)
	{
		perror("malloc fail");
		return ;
	}
	php->capacity = 4;//默认首次开辟容量为4
	php->size = 0;
}

1.2堆的销毁

void HeapDestroy(HP* php)
{
    assert(php);

	free(php->a);
    php->a = NULL;
    php->capacity = php->size = 0;
}

1.3入堆

 先插入一个10到数组的尾上,再进行向上调整算法,直到满足堆.

void HeapPush(HP* php, HPDataType x)
{
	assert(php);

	if (php->size == php->capacity)//容量填满
	{
		HPDataType* tmp = (HPDataType*)realloc(php->a, sizeof(HPDataType)*php->capacity*2);
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		php->a = tmp;
		php->capacity *= 2;
	}
	//在二叉树末尾插入x
	php->a[php->size] = x;
	php->size++;
	
	//向上调整
	AdjustUp(php->a, php->size - 1);

}

1.4出堆(堆的删除)

删除堆是删除堆顶的数据,将堆顶的数据根最后一个数据一换,然后删除数组最后一个数据,再进行向下调整算法。

void HeapPop(HP* php)
{
	assert(php);//堆得指针有效
	assert(!HeapEmpty(php));//堆不为空

	//删除数据
	Swap(&php->a[0], &php->a[php->size - 1]);
	php->size--;

	AdjustDown(php->a, php->size, 0);
}

1.5堆顶元素

HPDataType HeapTop(HP* php)
{
	assert(php);
	return php->a[0];
}

1.6堆是否为空的判定

bool HeapEmpty(HP* php)
{
	assert(php);
	return php->size == 0 ;
}

1.7堆大小判断

int  HeapSize(HP* php)
{
	assert(php);

	return php->size == 0;
}

1.8向上调整算法

void AdjustUp(HPDataType* a, int child)
{
	int parent = (child - 1) / 2;
	//while(parent >0)
	while (child > 0)
	{
		if (a[child] > a[parent])
		{
			Swap(&a[child], &a[parent]);
			child = parent;
			parent = (child - 1) / 2;
		}
		else
		{
			break;
		}
	}
}

1.9向下调整算法

void AdjustDown(HPDataType* a,int n, int parent)
{
	int child = parent * 2 + 1;
	while (child < n)
	{
		//选出左右孩子中大的那一个
		if (child + 1 < n && a[child+1] > a[child])//先检查越界,在检查左右孩子的大小
		{
			++child;
		}

		if (a[child] > a[parent])
		{
			Swap(&a[child], &a[parent]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			break;
		}
	}
}
//左右子树都是大堆

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值