優先順序佇列之堆實現

2021-07-13 08:55:39 字數 1627 閱讀 6589

優先順序佇列(priority queue)是0個或多個元素的集合,每個元素都有乙個優先權或值。優先順序佇列中,元素的出佇列順序不是同普通佇列一樣fifo(先進先出),而是按照優先順序遞增或遞減順序,但不是元素進入佇列的順序。

堆(heap)[-陣列表示]是實現優先順序佇列效率很高的資料結構。

堆即使完全二叉樹又是大根樹(或小根樹),[ps:大根樹指樹中每個節點的值都大於或等於其子節點的值,小根樹則相反]

以大根堆為例;

以下是大根堆的類**:

class maxheap

void initialize(int *theheap, int thesize);

void push(const

int& theelement);

void pop();

int &top();

unsigned size()

bool empty()

private:

int *heap;

unsigned heapsize;

unsigned heaplenth;

};

功能實現:

大根堆的插入:

如圖-上 所示,這裡有一棵5元素的大根堆,我們現在將值為21的元素插入其中, 插入過程是這樣的:

把新元素插入新節點,然後沿著新節點到根節點的路徑,執行一趟起泡操作,將新元素與其父節點的元素比較交換,直到後者大於或等於前者為止。

void maxheap::push(const

int &theelement)

heap[currentnode] = theelement;

}

大根堆的刪除:

大根堆中刪除乙個元素,就是刪除根節點的元素。

如圖-下所示, 我們首先將根節點元素刪除,我們的大根堆剩下了5個元素。此時的二叉樹需要重新組織,以便乃是大根堆(即重構,以對應一棵完全二叉樹)

為此,我們先將位置⑥的元素2取出,然後刪除原來2所在的節點,這樣就得到了乙個完全二叉樹,如第三步所示,因為此時的二叉樹不是大根樹,所以我們還需要做一步下沉的操作,我們將根節點不斷向較大的子節點下沉,直到沉到最底部,或根節點的值大於子節點的值。

**如下:

void maxheap::pop()

heap[1].~int();

int lasttheelement = heap[heapsize--];

int currentnode = 1;

int child = 2;

while(chile <= heapsize)

heap[currentnode] = lasttheelement;

}

以下是大根堆初始化的**:

void maxheap::initialize(int *theheap, int thesize)

heap[child / 2] = rootelement;}}

才疏學淺,如有不足,多多指

優先順序佇列(堆實現)

一 優先順序佇列定義 二 方法實現 獲得最大元素方法 去掉最大元素方法 修改優先順序方法 新增節點 三 實現 用堆實現乙個優先順序佇列 主要是新增 修改 刪除節點 節點具有唯一性 author hhf 2014年11月28日 public class priorityqueue 返回優先佇列中優先順...

優先順序佇列(堆實現)

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

堆(優先順序佇列)

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