c 手動和STL實現堆排序

2021-06-22 14:34:56 字數 1130 閱讀 3607

好久沒看最小堆了,突然上手寫半天還反應不過來。手動寫一下,順便貼上**:

手動實現:

#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 排序演算法 在任何時候,陣列中只有常數個元素儲存在陣列外。堆的資料結構不至少在堆排序中有用,還可以構成乙個有效的優先佇列。二叉堆資料結構是一種陣列物件,它可以被看做是一棵完全二叉樹。樹中的每個節點與陣列中存放該節點值的那個元素對應。除了最後...