優先順序佇列(堆實現)

2021-10-05 15:14:59 字數 2403 閱讀 4987

優先順序佇列

概念

一般來說我們會根據事情的重要程度優先處理某事,比如完成學習任務和刷微博,我們會認為完成學習任務比較重要,因此會先執行它,因此在這種情況下,資料結構就應提供兩個基本的操作,一是返回最高優先順序物件,二是新增新的物件,這種資料結構就叫做優先順序佇列。

二叉樹的順序儲存

儲存方式

使用陣列儲存二叉樹結構,即利用層序遍歷方式放入陣列中。

一般只適合表示完全二叉樹,因為非完全二叉樹會有空間的浪費。

而這種表示方法一般的用法就是堆的表示。

堆的概念:

順序儲存時的下標關係

已知父結點(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 滿足任意結點的值都大於其子樹的結點的值.叫做大堆,反...