好久沒看最小堆了,突然上手寫半天還反應不過來。手動寫一下,順便貼上**:
手動實現:
#includeusing namespace std;
const int maxn = 1000;
templateclass minheap
;templateminheap::minheap()
templatevoid minheap::makeheap(t* items, int num)
templatevoid minheap::shiftdown(int pos)
}templatevoid minheap::shiftup(int pos)
}templatevoid minheap::add(t item)
templatebool minheap::empty()
templatevoid minheap::clear()
int main()
heap.makeheap(items, 10);
cout<<"heap size is "<
stl實現:
建堆:make_heap(_first, _last, _comp)
預設是建立最大堆的。對int型別,可以在第三個引數傳入greater()得到最小堆。
在堆中新增資料:push_heap (_first, _last)
要先在容器中加入資料,再呼叫push_heap ()
在堆中刪除資料:pop_heap(_first, _last)
要先呼叫pop_heap()再在容器中刪除資料
堆排序:sort_heap(_first, _last)
排序之後就不再是乙個合法的heap了
注意:sort_heap 第三個引數必須和堆結構對應,否則會出現錯誤!!比如為最小堆時,sort_heap引數必須為greater(),得到的排序為從大到小;為最大堆時,引數預設或者為less(),得到的排序為從小到大。這是因為sort_heap實際就是一直在做pop,把堆頂的元素交換到最後。
#include#include#include#includeusing namespace std;
void printitem(vectoritems)
c 實現堆排序
include include include using namespace std 對比枝節點和左右子節點,將比較大的節點放置於枝節點 template int heapadjust t t,int i,int size if rightchild size t rightchild t max...
C 實現堆排序
堆排序是一種具有合併排序和插入排序共同優點的排序方法。它的時間複雜度為o nlgn 它也是一種原地排序演算法 在任何時候,陣列中只有常數個元素儲存在輸入陣列以外。要介紹堆排序首先要介紹什麼是堆。1.建堆 堆資料結構是一種陣列物件,它可以被視為一顆完全二叉樹,如下圖。右邊陣列表示的堆可以用左邊的完全二...
堆排序(C 實現)
堆排序執行時間 n lgn 它是一種原地 in place 排序演算法 在任何時候,陣列中只有常數個元素儲存在陣列外。堆的資料結構不至少在堆排序中有用,還可以構成乙個有效的優先佇列。二叉堆資料結構是一種陣列物件,它可以被看做是一棵完全二叉樹。樹中的每個節點與陣列中存放該節點值的那個元素對應。除了最後...