大根堆是一種樹形的結構,所有父結點都大於子結點,一般用一維陣列表示,若父結點下標為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 下...