二叉堆實現優先佇列中的上濾和下濾

2021-07-06 05:29:36 字數 1237 閱讀 8689

優先佇列是使用二叉堆來實現

其中很重要的兩個操作,乙個是插入,另乙個是刪除最優先值(這裡認為是最小值)

其中插入操作可以這樣實現:

把x放入二叉堆的最後端,然後再通過「上濾」操作把x放到相應位置

刪除操作可以這樣實現:

把最頂端的元素(即)最小值刪除,然後把堆中最後乙個元素先放到最頂端,然後通過「下濾」操作來使其到達正確位置

**如下:

#include #include typedef int elementtype;

#define mindata -1

typedef struct heapstruct *priorityqueue;

struct heapstruct ;

priorityqueue initialize( int maxelements ); /* details omitted */

void percolateup( int p, priorityqueue h );

void percolatedown( int p, priorityqueue h );

void insert( elementtype x, priorityqueue h )

elementtype deletemin( priorityqueue h )

int main()

void percolateup( int p, priorityqueue h )

h->elements[p] = temp;

} void percolatedown( int p, priorityqueue h )

h->elements[i] = temp;

}

但要注意幾點:

第一,可以把二叉堆對應陣列的第0個元素用來存放乙個「哨兵」mindata,這樣在上濾的過程中就不用特殊判斷是否到達頂端,因為如果到達頂端,elements[i/2]即為elements[0]一定比elements[1]要小,因此會自動停止上濾

第二,在上濾和下濾的比較過程中,千萬記得是用temp去和elements[p>>1]以及h->elements[child]去比

比如,while(temp < h->elements[p>>1])不要寫成while( h->elements[p]< h->elements[p>>1]),因為我們每次都是只單純把元素向下放,而不是交換,因此h->elements[p]仍舊是原來的值,而不是我們想象中的逐步上公升的上濾目標值

二叉堆實現優先佇列

最大堆 每個節點都大於等於它的兩個子節點 堆的操作 優先佇列 框架public class maxpq comparable 返回當前佇列中最大元素 public key max 插入元素 e public void insert key e 刪除並返回當前佇列中最大元素 public key de...

優先佇列和二叉堆

優先佇列 我們知道普通佇列滿足元素先進先出,也就可以看成先進的元素具有更高的優先順序,在出列時優先順序高的先出。而優先佇列中的元素的優先順序不侷限於 先進 某種定義賦予它們不同的優先順序,優先順序更高的先出列。本文涉及的優先佇列優先順序定義是 數值越小,優先順序越高。也就是說,每次取出的元素都是當前...

二叉堆和優先佇列

優先佇列是一種用來維護由一組元素構成的集合s的資料結構,其中的每乙個元素都有乙個相關的值,稱為關鍵字。優先佇列有最大優先佇列和最小優先佇列。優先佇列和一般的fifo佇列不一樣,從優先佇列獲取出來的值是喲優先順序的。例如,用來處理傳送給計算機部門印表機的職位 部門主管發來的職位應該首先被列印,依次是經...