堆的定义
堆结构是一种数组对象,它可以被视为一棵完全二叉树。树中每个结点与数组中存放该结点中值的那个元素相对应。
堆的性质
设数组A的长度为len,二叉树的结点个数为size,size≤len,则A[i]存储二叉树中编号为i的结点值(1≤i≤size),而A[size]以后的元素并不属于相应的堆,树的根为A[1],并且利用完全二叉树的性质,我们很容易求第i个结点的父结点(parent(i))、左孩子结点(left(i))、右孩子结点(right(i))的下标了,分别为:i/2、2i、2i+1;
对除根以外的每个结点i,A[parent(i)]≥A[i]。这种堆又称为“大根堆”;反之,对除根以外的每个结点i,A[parent(i)]≤A[i]的堆,称为“小根堆”。
堆的操作
put操作
void put(int d)
{
heap[++heap_size] = d;
//push_heap(heap + 1, heap + heap_size +1); //大根堆
push_heap(heap + 1, heap + heap_size + 1,greater<int>()); //小根堆
}
get操作
int get()
{
//pop_heap(heap + 1, heap + heap_size +1); //大根堆
pop_heap(heap + 1, heap + heap_size + 1,greater<int>()); //小根堆
return heap[heap_size--];
}
以上两个代码都需要头文件