以大根堆為例;優先順序佇列(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 刪除的是優...