資料結構 堆

2021-04-08 12:54:08 字數 1486 閱讀 3646

資料結構

——堆的操作和實現

當應用優先順序佇列或者進行堆排序時,一般利用堆來實現。堆是乙個完全(除最底層

外都是滿的)二叉樹,並滿足如下條件:

1、根結點若有子樹,則子樹一定也是堆。

2、根結點一定大於(或小於)子結點。

因為要求堆必須是完全二叉樹,所以可以用線性的資料結構,比如陣列,來實現堆。

利用陣列實現,則對於長為

n的堆中的元素從0到

n-1排列,有:

i的父結點:

parent(i)=(i+1)/2-1

i的左葉子:

left(i)=(i+1)*2-1

i的右葉子:

right(i)=(i+1)*2

堆的操作主要以乙個「堆化

」(

heapify

)操作為基礎,調整堆中的結點後,應用堆化操

作將其下降至合適的高度,且保持堆的性質。

插入時結點時,先將結點放入堆的最後位置,再逐步提公升至合適的位置即可。

以下是用

c實現的堆的相關操作:

以下內容為程式**

:int heap_init(heap* h,heap_index size)

/* heap_init */

void heap_heapify(heap* h,heap_index i,int heap_comp(heap_data,heap_data))

}/* heap_heapify */

int heap_increase_key(

heap* h,heap_index i,heap_data x,

int heap_comp(heap_data,heap_data))

h->data[i]=x;

return 0;

}/* heap_increase_key */

int heap_insert(heap* h,heap_data x,int heap_comp(heap_data,heap_data))

else

h->data[i]=x;

return 0;

}/* heap_insert */

heap_data heap_top(heap* h)

/* heap_top */

int heap_delete(heap* h,heap_data* x,int heap_comp(heap_data,heap_data))

/* heap_delete */

int heap_destory(heap* h)

/* heap_destory */

int heap_clean(heap* h)

/* heap_clean */

int heap_sort(

heap_data* data,heap_index size,

int heap_comp(heap_data,heap_data))

return 0;

}

資料結構 堆

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

資料結構 堆

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

資料結構 堆

堆 heap 的定義 子節點總是不大於或不小於根節點的一顆完全二叉樹。附完全二叉樹定義 除最後一層外,所有層的節點數都達到最大,最後一層只缺少右側的若干節點,即完全充滿,且是從左向右填充 最大堆 大頂堆 子節點總是不大於根節點 最小堆 小頂堆 子節點總是不小於根節點 對於陣列a和節點t,具有以下幾個...