資料結構
——堆的操作和實現
當應用優先順序佇列或者進行堆排序時,一般利用堆來實現。堆是乙個完全(除最底層
外都是滿的)二叉樹,並滿足如下條件:
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,具有以下幾個...