資料結構 堆

2021-10-02 23:22:50 字數 2003 閱讀 3005

1.堆的特性

(1)結構性:用陣列表示的完全二叉樹

(2)有序性:任一結點的優先順序是其子樹所有結點的最大值/最小值

最大堆(maxheap)/大頂堆:最大值

最小堆(minheap)/小頂堆:最小值

2.堆的型別定義

typedef

struct hnode *heap;

/* 堆的型別定義 */

struct hnode

;typedef heap maxheap;

/* 最大堆 */

typedef heap minheap;

/* 最小堆 */

#define maxdata 1000

/* 該值應根據具體情況定義為大於堆中所有可能元素的值 */

3.最大堆的操作
//空的最大堆的建立

maxheap createheap

(int maxsize )

//最大堆的插入

bool

isfull

( maxheap h )

bool

insert

( maxheap h, elementtype x )

i =++h-

>size;

/* i指向插入後堆中的最後乙個元素的位置 */

for(

; h-

>data[i/2]

< x; i/=2

)//直接用當前i開始迴圈,故不需要寫初始條件

//將待插入元素x與最底下的父結點比較,只要x>當前父結點說明x可以繼續上浮,故執行迴圈

h->data[i]

= h-

>data[i/2]

;//當前父結點下沉【迴圈開始前就有i=++h->size,這就是給下沉預留的位置】

//假設一次迴圈結束後執行i/=2得i=2,那麼下一次迴圈開始時,x將與i=1結點比較

//如果不符合迴圈開始的條件,即x < h->data[1],那麼x會插入到data[2]中

h->data[i]

= x;

/* 將x插入 */

return

true

;}

//最大堆的刪除

bool

isempty

( maxheap h )

elementtype deletemax

( maxheap h )

maxitem = h-

>data[1]

;/* 取出根結點存放的最大值 */

/* 用最大堆中最後乙個元素從根結點開始向上過濾下層結點 */

x = h-

>data[h-

>size--];

/* 注意當前堆的規模要減小 */

for( parent=

1; parent*

2<=h-

>size; parent=child )

h->data[parent]

= x;

return maxitem;

}

//最大堆的建立(將乙個已有堆調整為最大堆)

void

percdown

( maxheap h,

int p )

h->data[parent]

= x;

//最終找到滿足最大堆的parent位置,將存起來的值賦給這個位置

}void

buildheap

( maxheap h )

//對整個堆的每乙個父節點都用percdown函式調教一次,使得所有子堆都是最大堆

資料結構 堆

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

資料結構 堆

資料結構 堆的操作和實現 當應用優先順序佇列或者進行堆排序時,一般利用堆來實現。堆是乙個完全 除最底層 外都是滿的 二叉樹,並滿足如下條件 1 根結點若有子樹,則子樹一定也是堆。2 根結點一定大於 或小於 子結點。因為要求堆必須是完全二叉樹,所以可以用線性的資料結構,比如陣列,來實現堆。利用陣列實現...

資料結構 堆

堆常用來實現優先佇列,在這種佇列中,待刪除的元素為優先順序最高 最低 的那個。在任何時候,任意優先元素都是可以插入到佇列中去的,是電腦科學中一類特殊的資料結構的統稱 最大 最小 堆是一棵每乙個節點的鍵值都不小於 大於 其孩子 如果存在 的鍵值的樹。大頂堆是一棵完全二叉樹,同時也是一棵最大樹。小頂堆是...