堆應用 優先順序佇列(Priority Queue)

2021-10-04 20:35:52 字數 1210 閱讀 6836

優先順序佇列的實現方法有很多種,這裡我們通過堆來構建

(以降序,大堆為例)

1.入佇列:

通過尾插的方式入佇列,因為會破壞原有的堆結構,所以通過向上調整恢復堆結構。

2.出佇列:

若直接取出隊首元素的話,會影響後面元素的位置,所以我們將隊首元素與隊末元素交換,尾刪(size–),再將交換後的0號元素進行向下調整,恢復原有大堆結構。

3.取隊首元素,判斷陣列是否為空

每poll一次,就會輸出乙個優先順序最高或最低的元素,若poll n次,則相當於將原來的序列進行了排序。此時的結果就是按照降序結果輸出陣列元素。類似於堆排序

package container;

public

class

mypriorityqueue

//向上調整,大堆

private

void

shiftup

(int

array,

int index)

else

//更新位置

index=parent;

parent=

(index-1)

/2;}

}//出佇列,把下標為0也就是隊首元素出佇列刪除的同時,也希望剩下的結構依然是乙個堆結構,

// 所以方法就是將下標為0的元素和最末元素交換位置,然後尾刪(size--),再進行向下調整操作

public

intpoll()

//向下調整,恢復堆結構,大堆

public

static

void

shiftdown

(int array,

int size,

int index )}if

(array[index]

>=array[max]

)else

index=left;

left=index*2+

1;}}

//取隊頂

public

intpeek()

public

boolean

isempty()

public

static

void

main

(string[

] args)}}

9876

532

堆的應用 優先順序佇列

標頭檔案 pragma once ifndef heap h define heap h typedef int datatype typedef int compare datatype left,datatype right typedef struct heap heap void creat...

堆(優先順序佇列)

c 的 stl 中提供了 優先佇列 這一容器,它和普通的 fifo 佇列都定義在 中,有 push 和 pop 過程,分別表示 往佇列裡加入新元素 和 從佇列裡刪除隊首元素 唯一的區別是,在優先佇列中,元素並不是按照進入佇列的先後順序排列,而是按照優先順序的高低順序排列 換句話說,pop 刪除的是優...

堆 優先順序佇列

1一般二叉樹的順序儲存 層序遍歷方式 使用陣列儲存二叉樹結構,即將二叉樹 按照層序遍歷 的方式放入陣列.這種方式一般只適用於完全二叉樹,一般的二叉樹會造成空間浪費比較嚴重.2堆 heap 在邏輯上就是乙個 完全二叉樹,在物理上儲存在 陣列 中.1 滿足任意結點的值都大於其子樹的結點的值.叫做大堆,反...