堆也叫優先佇列,堆是一種特殊的完全二叉樹資料結
堆分為兩種,最大堆,最小堆。
最大堆:根節點大於左右兩個子節點的完全二叉樹
最小堆:根節點小於左右兩個子節點的完全二叉樹
堆可以用陣列來儲存,
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的左...