大小堆的實現與實現優先順序佇列

2021-07-25 17:49:42 字數 1527 閱讀 8541

堆:可視為一棵完全二叉樹結構,最小堆每個父節點都小於孩子結點,最大堆每個父節點都大於孩子結點。

建堆思想:實現向下調整演算法adjustdown():即當乙個節點的左子樹和右子樹都已為最大堆或最小堆(在這裡則尋找樹倒著走的第乙個非葉子結點,依次進行調整),比較其左右孩子結點滿足大堆或小堆要求的節點,再與此節點比較,若孩子結點大,滿足大堆交換兩節點值,或小堆,孩子結點小則交換。大堆與小堆思想基本相同,所以實現用仿函式進行實現。

建堆完成後可在堆中實現在尾部插入和刪除頭節點等操作,從中又實現乙個向上調整演算法adjustup(),其類似於向下調整演算法.

優先順序佇列:則在大堆與小堆基礎上實現佇列的優先順序等系列操作。

**實現:

#include #include #include #include using namespace std;

template //仿函式

struct less

};template >

class heap

heap(t* a,size_t n)

:_a(a,a+n) }

void push(const t& x)

void pop()

const t& top()

size_t size()

bool empty()

protected:

void _adjustdown(size_t root) //向下調整

else

break;

} }void _adjustup(size_t child) //向上調整

else

break;

} }protected:

vector_a;

};template >

class priorityqueue //優先順序佇列

void pop()

const t& top()

size_t size()

bool empty()

protected:

heap_hp1; //用堆實現

};void testheap()

; heaphp1(a1,sizeof(a1)/sizeof(a1[0]));

hp1.push(20);

hp1.pop();

//最小堆

int a2=;

heap> hp2(a2,sizeof(a2)/sizeof(a2[0]));

hp2.push(9);

hp2.pop();

}void testpriorityqueue()

{ priorityqueueque;

que.push(10);

que.push(11);

que.push(13);

que.push(12);

que.push(16);

que.push(18);

que.push(15);

que.push(17);

if(!que.empty())

{ cout<

優先順序佇列的實現

優先順序佇列 佇列裡面的所有元素都有相應的權值,元素的刪除順序由這些權值決定。優先順序佇列的實現一般用堆來實現其效率比一般的實現要高。要弄清楚堆我們得先弄清楚下面的定義 一顆大根樹 小根樹 是這樣一棵樹,其中每個節點的值都大於 小於 或等於其子節點 如果有子節點的話 的值。大根堆 乙個大根堆 小根堆...

優先順序佇列的實現

首先優先順序佇列的概念脫胎於佇列,佇列有先進先出的概念,優先順序佇列則根據優先順序的次序從佇列中彈出元素。優先佇列的底層實現是堆,因為堆的插入時間複雜度為o logn 所以優先順序佇列的入隊操作的時間複雜度也是o logn 堆可以由動態陣列實現的。優先順序佇列中比較重要的兩個操作是插入和刪除。如下簡...

堆的實現(大小堆及 優先佇列

一 堆的概念 堆資料結構是一種陣列物件,它可以被視為一棵完全二叉樹結構。堆結構的二叉樹儲存是 最大堆 每個父節點的都大於孩子節點。最小堆 每個父節點的都小於孩子節點。堆疊中的物體具有乙個特性 最後乙個放入堆疊中的物體總是被最先拿出來,這個特性通常稱為後進先出 lifo 佇列。堆疊中定義了一些操作。兩...