優先順序佇列
概念
一般來說我們會根據事情的重要程度優先處理某事,比如完成學習任務和刷微博,我們會認為完成學習任務比較重要,因此會先執行它,因此在這種情況下,資料結構就應提供兩個基本的操作,一是返回最高優先順序物件,二是新增新的物件,這種資料結構就叫做優先順序佇列。
二叉樹的順序儲存
儲存方式
使用陣列儲存二叉樹結構,即利用層序遍歷方式放入陣列中。
一般只適合表示完全二叉樹,因為非完全二叉樹會有空間的浪費。
而這種表示方法一般的用法就是堆的表示。
堆
堆的概念:
順序儲存時的下標關係
已知父結點(parent)的下標,則
已知孩子節點的下標,則
堆的向下調整
前提:左右子樹必須已經是乙個堆才能調整
此操作常用於優先佇列的出隊操作後的排序
以大頂堆為例:
public
void
shiftdown
(int
array,
int size,
int index)
//然後比較子樹和父結點誰的值較大,如果子樹的值大則將父節點的值和子樹節點的值交換
if(array[child]
> array[parent]
)else
//如果父結點的值比子樹的值小,則完成交換後還要進行更新,並進行迴圈以確保交換後子樹滿足堆的性質
parent = child;
child = parent *2+
1;}}
堆的向上調整
此操作常用於優先順序佇列的插入完成後的排序 (每次只能從一側向上調整)
public
void
shiftup
(int
array,
int size,
int index)
else
child = parent;
parent =
(child -1)
/2;}
}
利用堆實現優先順序佇列
實現插入、刪除、判空等基本操作
public
class
mypriorityqueue
//出隊首元素
public integer poll()
//先記錄隊首元素
int ret =
this
.array[0]
;//讓隊尾元素替代隊首元素,避免損壞堆的結構
this
.array[0]
=this
.array[size-1]
; size--
;//已用空間--
//調整一遍堆
shiftdown
(this
.array,
this
.size,0)
;//返回原隊首元素
return ret;
}//判空
public
boolean
isempty()
return
false;}
//此方法是用來將乙個不是堆的完全二叉樹構造成堆
public
void
creatheap
(int
newarray)
}public
void
shiftdown
(int
array,
int size,
int index)
//然後比較子樹和父結點誰的值較大,如果子樹的值大則將父節點的值和子樹的值交換
if(array[child]
> array[parent]
)else
//如果父結點的值比子樹的值小,則完成交換後還要進行更新,並進行迴圈以確保交換後子樹滿足堆的性質
parent = child;
child = parent *2+
1;}}
public
void
shiftup
(int
array,
int size,
int index)
else
child = parent;
parent =
(child -1)
/2;}
}}
優先順序佇列(堆實現)
一 優先順序佇列定義 二 方法實現 獲得最大元素方法 去掉最大元素方法 修改優先順序方法 新增節點 三 實現 用堆實現乙個優先順序佇列 主要是新增 修改 刪除節點 節點具有唯一性 author hhf 2014年11月28日 public class priorityqueue 返回優先佇列中優先順...
堆(優先順序佇列)
c 的 stl 中提供了 優先佇列 這一容器,它和普通的 fifo 佇列都定義在 中,有 push 和 pop 過程,分別表示 往佇列裡加入新元素 和 從佇列裡刪除隊首元素 唯一的區別是,在優先佇列中,元素並不是按照進入佇列的先後順序排列,而是按照優先順序的高低順序排列 換句話說,pop 刪除的是優...
堆 優先順序佇列
1一般二叉樹的順序儲存 層序遍歷方式 使用陣列儲存二叉樹結構,即將二叉樹 按照層序遍歷 的方式放入陣列.這種方式一般只適用於完全二叉樹,一般的二叉樹會造成空間浪費比較嚴重.2堆 heap 在邏輯上就是乙個 完全二叉樹,在物理上儲存在 陣列 中.1 滿足任意結點的值都大於其子樹的結點的值.叫做大堆,反...