#pragma once
#include <vector>
#include <assert.h>
//
// 小堆 == 大堆
// 仿函数
//
template<class T>
struct Greater
{
bool operator() (const T& l, const T& r)
{
return l > r;
}
};
template<class T>
struct Less
{
bool operator() (const T& l, const T& r)
{
return l < r;
}
};
template<class T, class Compare = Less<T>>
class Heap
{
public:
Heap()
{}
Heap(const T* a, size_t size)
{
for(size_t i = 0; i < size; ++i)
{
_array.push_back(a[i]);
}
// 构建堆
for (int i = (_array.size()-2)/2; i >=0; --i)
{
AdjustDown(i);
}
}
void Push(const T& x)
{
_array.push_back(x);
AdjustUp(_array.size() - 1);
}
void Pop()
{
assert(_array.size() > 0);
swap(_array[0], _array[_array.size() - 1]);
_array.pop_back();
AdjustDown(0);
}
void AdjustDown(int parent)
{
int child = parent*2+1;
while(child < _array.size(
大/小堆:源代码
最新推荐文章于 2021-09-14 15:27:28 发布