C Heap 堆的實現(最小堆 最大堆)

2021-09-02 07:39:38 字數 3000 閱讀 9277

堆也叫優先佇列,堆是一種特殊的完全二叉樹資料結

堆分為兩種,最大堆,最小堆。

最大堆:根節點大於左右兩個子節點的完全二叉樹

最小堆:根節點小於左右兩個子節點的完全二叉樹

堆可以用陣列來儲存,

a[i]處存根節點,a[2 * i]存左子樹的根節點 ; a[2 * i + 1]存右子樹的根節點。i從1開始!!

;//元素下沉

void

_sink

(int index)

;//元素上浮

void

_floating

(int index);}

;template

myheap::

myheap

(t data,

int len, heaptype type)

:_size(0

),_capacity

(len)

,_type

(type)

template

myheap::

myheap

(int capacity, heaptype type)

:_size(0

),_capacity

(capacity)

,_type

(type)

//建立乙個capacity空間大小的空堆

template

myheap::

~myheap()

template

bool myheap::

push

(t data)

else

}template

void myheap::

_floating

(int index)

}else

if(_type==maxheap)

}return;}

template

void myheap::

_swap

(int i,

int j)

template

void myheap::

_sink

(int index)

//與右結點比

else

if(i *2+

1<= _size && _vecdata[i -1]

> _vecdata[i *2]

)else

break;}

}else

if(_type == maxheap)

//與右結點比

else

if(i *2+

1<= _size && _vecdata[i -1]

< _vecdata[i *2]

)else

break;}

}}template

void myheap::

print()

template

bool myheap::

pop(

int index)

_vecdata[index]

= _vecdata[_size -1]

;--_size ;

_sink

(index+1)

;return true;

}

//堆也叫優先佇列,堆是一種特殊的完全二叉樹資料結

//堆分為兩種,最大堆,最小堆。

//最大堆:根節點大於左右兩個子節點的完全二叉樹

//最小堆:根節點小於左右兩個子節點的完全二叉樹

//堆可以用陣列來儲存,

//a[i]處存根節點,a[2 * i]存左子樹的根節點 ; a[2 * i + 1]存右子樹的根節點。i從1開始!!

#include

#include

"myheap.h"

using namespace std;

intmain()

;int maxheapbuffer[10]

=;myheap<

int>

minheap

(minheapbuffer,

10,minheap)

; myheap<

int>

maxheap

(maxheapbuffer,

10,maxheap)

;//小頂堆

minheap.

print()

; minheap.

pop(1)

; minheap.

print()

; minheap.

push(1

);minheap.

print()

; cout << endl;

//大頂堆

**:堆 heap

最大堆 最小堆

堆是一種經過排序的完全二叉樹,其中任一非終端節點的資料值均不大於 或不小於 其左孩子和右孩子節點的值。最大堆和最小堆是 二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵值中最大者。最小堆 根結點的鍵值是所有堆結點鍵值中最小者。而最大 最小堆集結了最大堆和最小堆的優點,這也是其名字的由來。最大 最...

最大堆 最小堆

堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點分別是節點i的左...

最大堆 最小堆

堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點分別是節點i的左...