您好,登錄后才能下訂單哦!
堆對象的創(chuàng)建與實現(xiàn)的核心思想就是上調(diào)(adjustup)與下調(diào)(adjustdown)的算法思想,上調(diào)用于創(chuàng)建堆時,從第一個非葉子節(jié)點開始向根節(jié)點根據(jù)需求調(diào)整為大堆或者小堆
下調(diào)如圖示:
當(dāng)我們進(jìn)行插入時,會影響堆的結(jié)構(gòu),這時我們用尾插,然后上調(diào)如圖示:
接下來就可以創(chuàng)建堆類,代碼如下僅供參考:
#include<iostream> #include<vector> template <class T> struct CompMax { bool operator()(const T& a, const T& b) { return a > b; } }; template <class T> struct CompMin { bool operator()(const T& a,const T& b) { return a < b; } }; template <class T,class Com=CompMax<T> >//仿函數(shù)做模板參數(shù),可根據(jù)需求修改比較方法 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<T> _List; Com comp; };
如有不足希望指正,如有問題也希望提出,謝謝-3-。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。