C 類模板實現大根堆

2021-10-07 04:21:23 字數 2409 閱讀 5326

大根堆是一種樹形的結構,所有父結點都大於子結點,一般用一維陣列表示,若父結點下標為n (開始下標從0開始),則左孩子下標為 2n+1.右孩子為2n+2

堆資料使用stl向量vector儲存

容量vector自動擴充

#pragma once

#include

template

<

class

t>

class

maxheap

;template

<

class

t>

inline maxheap

::maxheap

(size_t capacity)

:m_size(0

)template

<

class

t>

inline maxheap::~

maxheap()

template

<

class

t>

inline

bool maxheap

::isempty()

const

template

<

class

t>

inline

void maxheap

::push

(const t& item)

m_heap-

>

at(m_size)

= item;

//插入最後乙個元素

__insertfix

(m_size++);

}template

<

class

t>

inline

void maxheap

::pop()

//m_heap->at(0).~t();

//m_heap->at(0) = m_heap->at(--m_size);

std::

swap

(m_heap-

>at(

0), m_heap-

>

at(m_size -1)

);//最後乙個元素與第乙個交換

m_heap-

>at(

--m_size).~

t();

//刪除最後元素

__deletetfix(0

);}template

<

class

t>

inline

const t& maxheap

::top()

const

return m_heap-

>at(

0);}

template

<

class

t>

inline size_t maxheap

::size()

const

template

<

class

t>

inline

void maxheap

::__insertfix

(int index)

m_heap-

>

at(index)

= temp;

}template

<

class

t>

inline

void maxheap

::__deletetfix

(int index)

else

//已找到合適位置,當前結點(maxchild的父親)

if(temp > m_heap-

>

at(maxchild)

) m_heap-

>

at(index)

= m_heap-

>

at(maxchild)

; index = maxchild;

}//覆蓋

m_heap-

>

at(index)

= temp;

}

#include

#include

#include

#include

#include

"maxheap.h"

using

namespace std;

void

test()

;for

(size_t i =

0; i <

9; i++

)while

(!h.

isempty()

)}void

main()

大根堆(模板)

今天學了大根堆,第一次從頭到尾個人手打,雖說有些stl能代替堆但效率很低,算了算300000的資料甚至要跑500ms。也算記錄一下吧。自己的 83ms 300000 pragma gcc optimize 3 include define n 500010 define inf 0x3f3f3f3f...

C 實現大根堆

一 堆的定義 堆的物理儲存結構是一維陣列,邏輯儲存結構是完全二叉樹。堆的基本操作包括 insert 向堆中插入乙個元素,deletetop 刪除堆頂元素 上面的就是乙個大根堆,大根堆具有以下性質 每乙個節點的值都小於它父節點的值。我們也可以從上面的中看出來。但是需要注意的是,每乙個節點的值的大小與它...

大根堆實現

堆 有兩種,一種是大根堆,另一種是小根堆。大根堆的意思是在跟的位置那個數是最大的。同理,小根堆的根元素是最小的。堆是乙個滿的二叉樹,除了最後乙個節點可能不是滿的。所以用陣列去陣列去實現它。乙個節點的index為i,則這個節點的兩個子節點的下標應該為2 i 1和2 i 2 父結點那就是 i 1 2 下...