ACM总结十九

堆的定义
堆结构是一种数组对象,它可以被视为一棵完全二叉树。树中每个结点与数组中存放该结点中值的那个元素相对应。
堆的性质
设数组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--];

}


以上两个代码都需要头文件

猜你喜欢

转载自blog.csdn.net/qq_43515378/article/details/90247027