堆資料結構與堆排序

2021-08-27 18:00:23 字數 1775 閱讀 9194

堆資料結構

堆(二叉堆)是近似的完全二叉樹,最底層允許不滿,

堆的相關,陣列長度length,heap_size有效長度(堆的有效元素,未排序的數目)。heap_size堆雖然很像二叉樹,但是我的理解就是用二叉樹的邏輯,但是最主要的區別在,堆的儲存是用陣列,只是用下標來幫助理解

堆的儲存結構

從上往下,按順序儲存。

然後是幾個相關的操作,

1、取父節點,取左子節點,取右子節點

2、然後是把資料變成最大堆的操作,其實是從某個節點向下變成最大堆的結構。這個功能完成。

maxheap()//時間複雜度是o(logn)

3.建堆的過程又要涉及到length與heap_size,我的理解是length

是陣列大小,heap-size是有效數目,在後面堆排序的過程中,可以用來表示未排序的剩餘的數目。

有n個有效元素的堆(完全二叉樹),葉子節點是n/2+1,到n

用該定理,從最小索引的葉子節點左邊開始(第乙個非葉子節點,例如上圖第五個元素7),遞迴maxheap過程,就建了最大堆。

buildmaxheap() 時間複雜度是o(n)

堆排序。

堆結構的根節點是最大數,然後把陣列最後乙個元素(底層的最後乙個葉子節點)與根節點交換,然後再把這個新的根節點(先前的底層的最後乙個葉子節點)進行maxheap變成最大堆,同時size-1,因為maxheap會需要用到size判斷對不對其進行處理。直到剩下兩個元素進行一次交換就可以了。

//堆資料結構與堆排序

#include #define depth 4//數的深度

#define size 10

using namespace std;

inline int parent(int i)//返回父節點的座標索引,陣列都是索引從0開始,

inline int left(int i)//返回左子節點的座標索引,陣列都是索引從0開始,

inline int right(int i)//返回右子節點的座標索引,陣列都是索引從0開始,

void swap(int & a,int & b);

void maxheap(int a,int i,int size,int n);//同樣i是從0開始的索引,維護i節點向下的最大堆性質,size是有效資料,即前面說的heap_size,n是陣列總大小

void buildmaxheap(int a,int size,int n);

void heapsort(int a,int n);

int main();

heapsort(a,n);

for(int i=0;ia[i])//這裡size是數目,第一次是n,而l,r是索引,所以比較的 邊界是size-1

largest = l;

if(ra[largest])

largest = r;

cout<

maxheap(a,i,size,n);

cout<

void swap(int & a,int & b)

總結堆排序

把堆資料變成最大堆(buildmaxheap):倒著數對所有非葉子節點進行maxheap,完成整個二叉堆的最大堆化

從根節點開始,每次把根節點(最大數)放到陣列結尾,然後再把這個根節點maxheap。

maxheap裡面用乙個size引數控制當前有幾個沒排序。

時間複雜度是o(nlogn)

資料結構 堆與堆排序

堆其實是從完全二叉樹演變過來的並且用來儲存資料的,什麼是完全二叉樹呢?完全二叉樹就是 若設二叉樹的深度為h,除第h層外,其它各層 1 h 1 的結點數都達到最大個數,第h層所有的結點都連續集中 在最左邊,這就是完全二叉樹。我們知道二叉樹可以用陣列模擬,堆自然也可以。現在讓我們來畫一棵完全二叉樹 從圖...

資料結構系列 堆與堆排序

堆是一種特殊的樹結構,通常將按照一定順序排列好的樹結構稱之為堆。堆是電腦科學中一類特殊的資料結構的統稱。堆通常是乙個可以被看做一棵樹的陣列物件。堆總是滿足下列性質 將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。常見的堆有二叉堆 斐波那契堆等。堆的定義如下 n個元素的序列當且僅...

堆(資料結構)及堆排序

這裡的堆是指一種資料結構 或資料結構屬性 非指堆記憶體。堆屬性用二叉樹來體現,具堆屬性的資料結構才可被叫做為堆。具堆屬性的資料結構滿足以下筆記的 順序 和 形狀 兩個條件。將某資料結構如陣列,將陣列的元素依次安排在二叉樹中的根結點 根結點的左孩子 根結點的右孩子位置之上,再將剩餘元素依次安排在根結點...