十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
堆对象的创建与实现的核心思想就是上调(adjustup)与下调(adjustdown)的算法思想,上调用于创建堆时,从第一个非叶子节点开始向根节点根据需求调整为大堆或者小堆
创新互联主要从事成都网站设计、网站制作、网页设计、企业做网站、公司建网站等业务。立足成都服务拜城,十年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220
下调如图示:
当我们进行插入时,会影响堆的结构,这时我们用尾插,然后上调如图示:
接下来就可以创建堆类,代码如下仅供参考:
#include#include template struct CompMax { bool operator()(const T& a, const T& b) { return a > b; } }; template struct CompMin { bool operator()(const T& a,const T& b) { return a < b; } }; template >//仿函数做模板参数,可根据需求修改比较方法 class Heap { public: Heap(const T* arr, size_t size, Com _comp) :comp(_comp) { _List.resize(size); int index = 0; for (index = 0; index < size; ++index) { _List[index] = arr[index]; } index = (_List.size()- 2) / 2; while (index>=0) _adjustdown(index--); } void Push(const T &x) { _List.push_back(x); size_t index = _List.size() - 1; _adjustup(index); } void Pop() { _List.pop_back(); } T& Top() { return _List[0]; } protected: void _adjustup(size_t index) { size_t child = index; size_t parent = (child - 1) / 2; while (child) { if (child % 2) { if (child + 1<_List.size()) child =comp(_List[child],_List[child+1]) ? child : child + 1; } else { child = comp(_List[child] ,_List[child - 1]) ? child : child - 1; } if (!comp(_List[child],_List[parent])) { std::swap(_List[parent], _List[child]); } child = parent; parent = (parent - 1) / 2; } } void _adjustdown(size_t index) { size_t parent = index; size_t child = parent * 2 + 1; while (child < _List.size()) { if (child + 1 < _List.size()) child = comp(_List[child] , _List[child + 1]) ? child : child + 1; if (!comp(_List[parent], _List[child])) { std::swap(_List[child], _List[parent]); parent = child; child = (parent + 1) * 2; } else break; } } protected: vector _List; Com comp; };
如有不足希望指正,如有问题也希望提出,谢谢-3-。