基础
完全二叉树
代码
namespace little_Pile
{
//小根堆 (大根堆更改为大于号)
const int N;
int len;
int heap[N];
int hp[N];// hp[k]存储堆中下标是 k 的点是第几个插入的
int ph[N];// ph[k]存储第 k 个插入的点在堆中的位置
//k是下标
void PH_Swap(int x, int y); //交换
void Up(int k);//向上调整
void Down(int k);//向下调整
void Insert(int k, int x); //插入, x是第几次插入
void Pop(int k);//删除
//交换
void PH_Swap(int x, int y)
{
swap(ph[hp[x]],ph[hp[y]]);
swap(hp[x], hp[y]);
swap(heap[y], heap[x]);
}
//向上调整
void Up(int k)
{
while(k > 1 && heap[k] < heap[k / 2]) //根据需要更改
{
PH_Swap(k, k / 2);
k /= 2;
}
}
//向下调整
void Down(int k)
{
while(k + k <= len)
{
int t = k + k;
if(t + 1 <= len && heap[t + 1] < heap[t]) ++t; //根据需要更改
if (heap[t] >= heap[k]) break;
PH_Swap(t, k);
k = t;
}
}
//插入
void Insert(int x, int k) //k是第几次插入
{
heap[++len] = x;
ph[k] = len;
hp[len] = k;
Up(len);
}
//删除
void Pop(int k)
{
if (k == len)
{
--len;
return;
}
PH_Swap(k, len);
--len;
Up(K);
Down(k);
}
}
STL(priority_queue默认大根堆)
注意
只能删除堆顶元素,且无清空
使用
empty(), size(), top(), push(), pop();
小根堆定义 priority_queue, greeter> q;
复杂度
O(nlogn)
每次操作均是logn