資料結構 二叉堆與堆排序

2021-07-11 10:08:06 字數 2452 閱讀 7594

二叉堆,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堆雖然很像二叉樹,但是我的理解就是用二叉樹的邏輯,但是最主要的區別在,堆的儲存是用陣列,只是用下標來幫助理解 堆的儲存結構 從上往下,...