二叉堆,binaryheap,是二叉樹中的常見的一種結構。通常以最大堆和最小堆的形式呈現。最大堆指的是父節點大於等於孩子節點的value值,也就是說對於最大堆而言,根元素是二叉堆最大的元素。最小堆的概念是與最大堆的概念是相似的。下圖是最大堆的示意圖:
二叉堆最顯著的特徵就是根元素是二叉樹元素間最大的或者最小的。因此每次將二叉樹最大或者最小的元素取出來,同時保證每次進行這樣的操作後,剩下的元素依然可以保持二叉堆的性質,這樣迭代這個過程,就可以完成排序的目的。
所以,進行堆排序的過程,首先就需要進行待排序元素的堆建立過程。這裡以最大堆為例。
在建立最大堆的過程中,每插入乙個元素,就要對元素進行乙個上浮的操作。上浮是指對每個即將插入最大堆的元素進行判斷,判斷與當前元素與其父元素的大小關係,保持父元素與孩子元素之間的大小關係,重複這個過程,直到從根元素開始,所有的父元素和孩子元素都和二叉堆的定義保持一致。具體實現過程如下:
首先是最大堆的adt:
templateclass binaryheap
;
然後是最大堆的建立過程:
templatevoid binaryheap::filterup(int start)
m_pdata[mcursize]=data;
filterup(mcursize);
}
完成了最大堆的建立,就可以進行最大元素的抽取了,將抽取的元素存起來,就可以進行迭代過程的排序了:
這裡在抽取最大元素的抽取後,相應的元素個數就會減少乙個,如果是把根元素的孩子結點移動到根元素的位置,然後從上往下進行這樣的移動,這樣不能很好的保持完全二叉樹的性質。因此這裡採取的小技巧是,將二叉樹的最後乙個元素移動到根元素的位置,這樣僅僅只是交換value值,不需要頻繁的移動元素的位置。以下是該過程的示意圖:
第一步:
第二步:
這樣就完成了最大元素的抽取過程了,然後下面是具體的實現過程:
templatet binaryheap::delheap()
else
else
nindex=2*parentindex+1;}}
m_pdata[parentindex]=tempcur;
if(mcursize>1)
mcursize--;
else
;templatebinaryheap::binaryheap(int capacity)
templatebinaryheap::~binaryheap()
templatevoid binaryheap::filterup(int start)
m_pdata[mcursize]=data;
filterup(mcursize);
}templatevoid binaryheap::buildheap(vectorinitarray)
else
else
nindex=2*parentindex+1;}}
m_pdata[parentindex]=tempcur;
if(mcursize>1)
mcursize--;
else
{mcursize--;
cout<
{ for(int i=0;i
然後是主過程的呼叫,在主過程完成排序:
#include #include#include#include"binaryheap.h"
using namespace std;
int main()
{ srand(unsigned(time(null)));
vectorinitarray;
int data=rand()%100;
int length=rand()%15;
int cnt=0;
while(cntheap(30);
heap.buildheap(initarray);
cout<
for(int i=0;i
然後結果如下:
資料結構之二叉堆 構建堆,堆排序
public class heap system.out.println 原始 printheapbylevel array system.out.println 最小堆 getminheap array printheapbylevel array sort array printheapbyle...
資料結構 堆與堆排序
堆其實是從完全二叉樹演變過來的並且用來儲存資料的,什麼是完全二叉樹呢?完全二叉樹就是 若設二叉樹的深度為h,除第h層外,其它各層 1 h 1 的結點數都達到最大個數,第h層所有的結點都連續集中 在最左邊,這就是完全二叉樹。我們知道二叉樹可以用陣列模擬,堆自然也可以。現在讓我們來畫一棵完全二叉樹 從圖...
堆資料結構與堆排序
堆資料結構 堆 二叉堆 是近似的完全二叉樹,最底層允許不滿,堆的相關,陣列長度length,heap size有效長度 堆的有效元素,未排序的數目 heap size堆雖然很像二叉樹,但是我的理解就是用二叉樹的邏輯,但是最主要的區別在,堆的儲存是用陣列,只是用下標來幫助理解 堆的儲存結構 從上往下,...