堆通常是乙個可以被看做一棵樹的陣列物件。將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。
堆總是滿足下列性質:
應用:c++ stl**:
定義方法一:
//需要調動到#include,以下以a為例:
大根堆的呼叫:priority_queuea;
小根堆的呼叫:priority_queue,greater> a;
定義方法二;
#include //stl在中實現了對儲存在陣列或vector中的元素進行堆操作的函式,
//包括make_heap, pop_heap, push_heap, sort_heap
//make_heap( ):建立堆(要麼大頂堆,要麼小頂堆)
//push_heap( ): 在堆中新增元素
//pop_heap( ): 在堆中刪除元素
//sort_heap( ): 堆排序
vectormin=
make_heap(min.begin(), min.end(), greater());
//push_heap()
//要先在底層容器(陣列或vector)裡加入資料,再呼叫push_heap()。
//實現細節:(1)新增元素到vector的尾部;(2)重新調整堆。
//該演算法必須是在滿足堆序的條件下,新增元素。
min.push_back(15);
push_heap(min.begin(), min.end());
//pop_heap(_first, _last,_comp)
//實現細節:(1)刪除堆頂元素;(2)用尾部元素替代max_heap[0];(3)重新調整堆。
//(pop_heap操作實際上是我們把堆頂元素取出來,放到了陣列或vector容器的末尾,用原來的末尾元素去替代,然後end迭代器減1,執行siftdown()下溯函式來重新調整堆)
//注意演算法執行完畢後,最大的元素並沒有被取走,而是放於底層容器的末尾。如果要取走,則可以使用底部容器(vector)提供的pop_back()函式。
//pop_heap()操作後,再呼叫min.pop_back(),從底層容器中刪掉原堆頂元素。
pop_heap(min.begin(), min.end());//取出了堆頂元素(也叫刪除堆頂元素),放到了底層容器的末尾,原來末尾的元素替代堆頂,end迭代器減1,重新siftdown了堆
min.pop_back();//從底層容器(陣列或vector)中刪除了元素
sort_heap(_first, _last,_comp)
既然每次pop_heap可以獲得堆頂的元素(假如是大頂堆,每次都獲得最大的元素,取出放到了底層容器的末尾),那麼我們持續對整個heap做pop_heap操作,每次講操作的範圍向前縮減乙個元素(就是每次end迭代器減1)。最終我們可以獲得乙個遞增的序列。
注意:這個排序是在乙個堆上進行的。
sort_heap(min.begin(),min.end(), greater());
堆排序細節實現c++:#includeusing namespace std;
void heapsort(int a, int n);
void maxheap(int a, int n);
void buildmaxheap(int a, int n);
int size;
int main()
; size= sizeof(a) / 4;
heapsort(a, size);
for (int i = 0; i < 8; i++)
cout << a[i] << " ";
return 0;
}void heapsort(int a, int n) }
void buildmaxheap(int a, int n)
void maxheap(int a, int n)
}
資料結構 堆
最大堆 最小堆 堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點...
資料結構 堆
資料結構 堆的操作和實現 當應用優先順序佇列或者進行堆排序時,一般利用堆來實現。堆是乙個完全 除最底層 外都是滿的 二叉樹,並滿足如下條件 1 根結點若有子樹,則子樹一定也是堆。2 根結點一定大於 或小於 子結點。因為要求堆必須是完全二叉樹,所以可以用線性的資料結構,比如陣列,來實現堆。利用陣列實現...
資料結構 堆
堆常用來實現優先佇列,在這種佇列中,待刪除的元素為優先順序最高 最低 的那個。在任何時候,任意優先元素都是可以插入到佇列中去的,是電腦科學中一類特殊的資料結構的統稱 最大 最小 堆是一棵每乙個節點的鍵值都不小於 大於 其孩子 如果存在 的鍵值的樹。大頂堆是一棵完全二叉樹,同時也是一棵最大樹。小頂堆是...