priority.h
namespace bit
{
template <class T, class Container = vector<T>, class Compare = less<T> >
class priority_queue
{
public:
priority_queue()
{}
template <class InputIterator>
priority_queue(InputIterator first, InputIterator last)
:c(first,last)
{
for (int i = (c.size() - 2) / 2; i >= 0; i--)
//从倒数第二层的最后一个父节点(size-1-1)/2 == (size-2)/2开始,向下调整建堆
{
adjust_down(i);
}
}
void adjust_up(int child)//向上调整
{
Compare comp;
size_t parent = (child - 1) / 2;
while (child > 0)
{
if(comp(c[parent],c[child]))
/*if (c[parent] < c[child])*/
{
swap(c[child], c[parent]);
child = parent;
parent = (parent - 1) / 2;
}
else
{
break;
}
}
}
void adjust_down(int parent)//向下调整
{
Compare comp;
size_t child = parent * 2 + 1;
while (child < c.size())
{
if (child + 1 < c.size()
&& c[child + 1] > c[child])
{
++child;
}
if(comp(c[parent],c[child]))
/*if (c[parent] < c[child])*/
{
swap(c[child],c[parent]);
parent = child;
child = parent * 2 + 1;
}
else
{
break;
}
}
}
bool empty() const
{
return c.empty();
}
size_t size() const
{
return c.size();
}
T& top()
{
return c[0];
}
void push(const T& x)
{
c.push_back(x);
adjust_up(c.size() - 1);//向上调整
}
void pop()
{
swap(c[0], c[c.size() - 1]);
c.pop_back();
adjust_down(0);
}
private:
Container c;
Compare comp;
};
};