堆和優先佇列

2021-07-25 02:26:35 字數 2242 閱讀 1611

優先佇列(priority queue):特殊的「佇列」,取出元素的順序是依照元素的優先權(關鍵字)大小,而不是元素進入佇列的先後順序。

優先佇列的完全二叉樹表示

note:0號位置是為了之後的插入操作方便,而加入的哨兵,如果在堆排序中,未給出這樣的結點,則可不設定。

堆的兩個特性

結構性:用陣列表示的完全二叉樹

區域性有序性:任一結點的關鍵字是其子樹所有結點的最大值(或最小值)

note:①此處易和二叉搜尋樹進行混淆,只是區域性有界

②判斷是否是最小堆(1)完全二叉樹

(2)從根結點到任意結點路徑上結點序列的有序性!

 「最大堆(maxheap)」,也稱「大頂堆」:最大值

 「最小堆(minheap)」,也稱「小頂堆」 :最小值

template 

class minheap ; //析構函式

bool isempty( ); // 如果堆空,則返回真

bool isleaf(int pos) const; //如果是葉結點,返回true

int leftchild(int pos) const; //返回左孩子位置

int rightchild(int pos) const; //返回右孩子位置

int parent(int pos) const; //返回父結點位置

bool remove(int pos, t& node); //刪除給定下標的元素

bool insert(const t& newnode); //向堆中插入新元素newnode

t& removemin(); //從堆頂刪除最小值

void siftup(int position); //從position向上開始調整,使序列成為堆

void siftdown(int left); //篩選法函式,引數left表示開始處理的陣列下標

};

一、插入新元素——向上篩選

::swap(int pos_x, int pos_y) //交換位置x和y的元素 template

bool minheap

::insert(const t& newnode) template

void minheap

::siftup(int position) heaparray[temppos] = temp; }

二、刪除堆頂(取最大值或者最小值)——向下篩選

第一步:取最後的那個結點代替棧頂結點

第二步:向下篩選

template

t& minheap

::removemin()

}template

void minheap

::siftdown(int left) else break; } heaparray[i] = temp; }

三、堆的建立

建立最大(小)堆:將已經存在的n個元素按最大(小)堆的要求存放在乙個一維陣列中

調整從棧頂最後乙個沒有子女的結點進行向下篩選

template

void minheap

::buildheap()

堆和優先佇列

學習資料結構的時候就學習過堆,不過忘了很多了,程式設計珠璣 裡也有這一章,因此重新總結一下。堆的兩個性格 1 順序性質 任何結點的值都小於或等於子結點的值。對於最小堆而言 2 形狀性質 二叉樹結構,最多在兩層上具有葉結點,其中最底層的結點盡可能的靠左分布。堆的實現 考慮以陣列實現,對於大小為n的堆,...

堆和優先佇列

include using namespace std class heap public heap int intput capacity heap void push int value size void heap sort void output cout n inttop void pop...

優先佇列和堆

怎麼理解優先佇列和堆的關係?簡單來說 堆排序是一種排序演算法,利用堆結構完成排序的功能 優先佇列是一種資料結構,它是利用堆來實現。具體來說,堆排序過程 建堆 堆頂就是最大 或小 值,然後堆頂跟最後乙個元素交換 調整堆,反覆這個過程,直到堆裡面所有元素都交換好 而優先佇列 建堆 堆頂元素就是優先順序最...