資料結構 堆

2021-10-01 02:39:09 字數 1964 閱讀 7433

堆通常是乙個可以被看做一棵樹的陣列物件。將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。

堆總是滿足下列性質:

應用: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 根結點一定大於 或小於 子結點。因為要求堆必須是完全二叉樹,所以可以用線性的資料結構,比如陣列,來實現堆。利用陣列實現...

資料結構 堆

堆常用來實現優先佇列,在這種佇列中,待刪除的元素為優先順序最高 最低 的那個。在任何時候,任意優先元素都是可以插入到佇列中去的,是電腦科學中一類特殊的資料結構的統稱 最大 最小 堆是一棵每乙個節點的鍵值都不小於 大於 其孩子 如果存在 的鍵值的樹。大頂堆是一棵完全二叉樹,同時也是一棵最大樹。小頂堆是...