用数组实现一个简单的heap(最大堆)结构

本文介绍了如何使用数组构建和操作最大堆,包括make_heap、push_heap和pop_heap函数的用途。通过示例展示了在解决Find_Top_K问题时如何利用最小堆找到数组中最大的K个元素,以及讨论了调整法建堆与插入法建堆的时间复杂度差异。
摘要由CSDN通过智能技术生成

make_heap函数用来从给定的任意顺序的数组创建一个最大堆。

push_heap函数向堆中压入一个新的数据,并维持堆的形态。

pop_heap函数取出堆中最大的元素,并将该元素从堆结构中剔除,维持堆的形态。


使用了定长数组作为基本的存储数据的结构,当数组空间满时,重新申请一个两倍长于当前数组的新数组,将元素复制过去。

heap.cpp

class heap
{
private:
	int *_A;
	int _size;	//当前元素数量
	int _max_size;	//所能容纳的最大数量
	void _adjust_heap(int i)
	{
		int left = 2 * i + 1;
		int right = 2 * i + 2;
		int largest;
		//选出三个节点中最大的元素,将他放到根节点中
		if(left <= _size - 1 && _A[left] > _A[i])
			largest = left;
		else
			largest = i;

		if(right <= _size - 1 && _A[right] > _A[largest])
			largest = right;

		if(largest != i)
		{
			int tmp = _A[i];
			_A[i] = _A[largest];
			_A[largest] = tmp;

			_adjust_heap(largest);
		}
	}
	void _double_heap()
	{
		int *tmp = new int[_size * 2];
		for(int i = 0; i < this->_size; i++)
		
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值