概念
滿足任意結點的值都大於其子樹中結點的值,叫做大堆,或者大根堆,或者最大堆
操作-向下調整
說明:array 代表儲存堆的陣列
size 代表陣列中被視為堆資料的個數
index 代表要調整位置的下標
left 代表 index 左孩子下標
right 代表 index 右孩子下標
min 代表 index 的最小值孩子的下標
過程(以小堆為例):
index 如果已經是葉子結點,則整個調整過程結束
判斷 index 位置有沒有孩子
因為堆是完全二叉樹,沒有左孩子就一定沒有右孩子,所以判斷是否有左孩子
因為堆的儲存結構是陣列,所以判斷是否有左孩子即判斷左孩子下標是否越界,即 left >= size 越界
確定 left 或 right,誰是 index 的最小孩子 min
如果右孩子不存在,則 min = left
否則,比較 array[left] 和 array[right] 值得大小,選擇小的為 min
比較 array[index] 的值 和 array[min] 的值,如果 array[index] <= array[min],則滿足堆的性質,調整結束
否則,交換 array[index] 和 array[min] 的值
然後因為 min 位置的堆的性質可能被破壞,所以把 min 視作 index,向下重複以上過程
//小堆向下調整
public static void shiftdown(int arr, int size, int index)
} if(arr[index]= 0; i--)
}//入佇列 (以大堆為例)
public static void shiftup(int arr, int index)
int tmp = arr[index];
arr[index] = arr[parternt];
arr[parternt] = tmp;
index = parternt;
}}
堆(優先順序佇列)
c 的 stl 中提供了 優先佇列 這一容器,它和普通的 fifo 佇列都定義在 中,有 push 和 pop 過程,分別表示 往佇列裡加入新元素 和 從佇列裡刪除隊首元素 唯一的區別是,在優先佇列中,元素並不是按照進入佇列的先後順序排列,而是按照優先順序的高低順序排列 換句話說,pop 刪除的是優...
堆 優先順序佇列
1一般二叉樹的順序儲存 層序遍歷方式 使用陣列儲存二叉樹結構,即將二叉樹 按照層序遍歷 的方式放入陣列.這種方式一般只適用於完全二叉樹,一般的二叉樹會造成空間浪費比較嚴重.2堆 heap 在邏輯上就是乙個 完全二叉樹,在物理上儲存在 陣列 中.1 滿足任意結點的值都大於其子樹的結點的值.叫做大堆,反...
優先順序佇列 堆
1.1 堆的概念 堆邏輯上是一棵完全二叉樹 堆物理上是儲存在陣列中位元科技 滿足任意結點的值都大於其子樹中結點的值,叫做大堆,或者大根堆,或者最大堆 反之,則是小堆,或者小根堆,或者最小堆 堆的基本作用是,快速找集合中的最值 1.2儲存方式 使用陣列儲存二叉樹結構,方式是將二叉樹用層序遍歷方式放入陣...