如果有乙個關鍵碼的集合k = ,把它的所有元素按完全二叉樹 的順序儲存方式儲存在乙個一維陣列中,並滿足:ki <= k2*i+1 且 ki<= k2*i+2 (ki >= k2*i+1 且 ki >= k2*i+2) i = 0,1,2…,則稱這個堆為最小堆(或最大堆)。
最大堆和最小堆是二叉堆的兩種形式。
最大堆:根結點的鍵值是所有堆結點鍵值中最大者,且每個結點的值都比其孩子的值大。
最小堆:根結點的鍵值是所有堆結點鍵值中最小者,且每個結點的值都比其孩子的值小。
這樣我們就能根據圖大小堆的規則構建大小堆了
我們根據陣列arr 最終要建立這樣乙個樹
下面圖示流程是
建立 最小堆的過程:
其實看懂了上面的流程,最小堆的**也就出來了。
下面把 最大堆的**就直接放在這了,當然還有一些操作,如:插入、刪除、堆頂元素之類的
#include#include#includeusing namespace std;
//use a vector create heap
template class heapgeater
heapgeater(const t arr, size_t size) //size is elem_count
size_t root = size / 2 - 1; // the last leef_node of root
for (int index = root; index >= 0; index--)
}bool empty()
size_t size()
t& top()const
const t&top()
void insert(const t& data)
}} void remove(const t& data) }
protected:
void _adjustdown(size_t root)//adjust to max_heap
//confirm the root is max
if (_heap[child] > _heap[root])
else
}//end while
} void adjustup(int root) }
private:
std::vector_heap;
};/********test code**********/
void test_heapgeater()
; heapgeaterap(arr,8);
cout <
cout<< ap.size()<
資料結構 大小堆的實現及堆排序
堆一般指二叉堆,結構如下 圈內數字指下標,圈外為內容,如圖現在並不能稱為乙個堆,因為它並不滿足大堆也不滿足小堆的組成,下面介紹大堆和小堆的簡答介紹和實現 大堆是指每個父節點的數都大於自己的每個孩子節點的值 用到的演算法是讓大數上移迴圈至完成大堆 void adjustup size t child ...
6 資料結構 最小堆
開發過程,經常需要對資料集合進行維護。維護資料結合的資料結構可統稱為容器。最小堆是維護資料集合的容器的一種,最小堆具備如下性質 設v i 為位置i的元素值 1.對維護的n個元素,順序儲存於索引為1 n的陣列位置 2.對索引i,若索引2 i n,有v i v 2 i 若索引2 i 1 n,有v i v...
資料結構 簡單實現優先佇列(維護大小堆)
主要思想是堆排序裡面的維護大 小堆。top一直指向堆頂,而push pop要維護堆,pop出的值是top。注意 大根堆和小根堆只需要堆頂最大 小就行!偽 方法 push 引數 pop 下面引用自 24隻羊 堆和優先佇列 2.1 堆中新增元素和shift up 現在我們要新增元素52,先新增到索引為1...