数据结构-堆(Heap)

#include <iostream>
#include <vector>

using namespace std;

template<typename T>   //仿函数,用来控制大堆小堆
struct Bigger
{
	bool operator()(T left, T right)
	{
		return left > right;
	}
};

template<typename T>
struct Lower
{
	bool operator()(T left, T right)
	{
		return left < right;
	}
};


template<typename T, typename Compare = Bigger<T>>
class Heap
{

public:
	Heap(){}
	Heap(T* a, size_t size)
		:_a(a, a + size)
	{
		for (int i = (_a.size() - 2) / 2; i >= 0; --i)
		{
			_AdjustDown(i);
		}
	}

	void Push(const T& x)
	{
		_a.push_back(x);
		_AdjustUp(_a.size() - 1);
	}

	void Pop()
	{
		if (_a.size() == 0)
			return;

		swap(_a[0], _a[_a.size() - 1]);
		_a.pop_back();
		_AdjustDown(0);
	}
protected:
	void _AdjustDown(size_t index)  
	{
		size_t parent = index;
		size_t child = parent * 2 + 1;

		while (child < _a.size())
		{
			if (child + 1<_a.size() && Compare()(_a[child + 1], _a[child]))
			{
				++child;
			}

			if (Compare()(_a[child], _a[parent]))
			{
				swap(_a[parent], _a[child]);
				parent = child;
				child = parent * 2 + 1;
			}
			else
			{
				break;
			}
		}
	}

	void _AdjustUp(size_t index)  
	{
		size_t child = index;
		size_t parent = (child - 1) / 2;

		while (child > 0)
		{
			if (Compare()(_a[child], _a[parent]))
			{
				swap(_a[parent], _a[child]);
				child = parent;
				parent = (child - 1) / 2;
			}
			else
			{
				break;
			}
		}
	}
protected:
	vector<T> _a;
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值