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

2021-07-12 02:04:22 字數 2507 閱讀 1106

一、堆的概念

堆資料結構是一種陣列物件,它可以被視為一棵完全二叉樹結構。

堆結構的二叉樹儲存是:

最大堆:每個父節點的都大於孩子節點。

最小堆:每個父節點的都小於孩子節點。

堆疊中的物體具有乙個特性: 最後乙個放入堆疊中的物體總是被最先拿出來, 這個特性通常稱為後進先出(lifo)

佇列。 堆疊中定義了一些操作。 兩個最重要的是push和pop。 push操作在堆疊的頂部加入一 個元素。pop操作相反, 在堆疊頂部移去乙個元素, 並將堆疊的大小減一。

在此,用vector容器來實現儲存,vector容器是乙個模板類,可以存放任何型別的物件(但必須是同一類物件)。vector物件可以在執行時高效地新增元素,並且vector中元素是連續儲存的

。當容量不夠時,它能夠自己去擴容。故我們在push資料時就不用考慮一些其他容量不足等等因素。

二、堆的實現

通過二叉樹來實現堆的結構。

先實現乙個compare,如果實現大小堆用物件調其對應類運算子「()」過載

templatestruct less

};templatestruct big

};

先定義乙個堆:

用模板的模板引數:

如:當 測試用例為:

int arr = ;

當你給定compare為big時它會按照大堆去排序

heapless>  n(arr, sizeof(arr)/sizeof(arr[0])); 

當你給定compare為big時它會按照小堆去排序

templateclass compare >  //模板的模板引數

class heap

heap(t* a, size_t size)

//建堆

for (int i = (_a.size() -2)/2; i >= 0; --i)

disp(_a, size);

} //pop時,先將第乙個與最後乙個交換,(這樣不至於打亂其他子堆的順序),然後

//刪除最後乙個,再讓它下調重新調整順序

void pop()       

//push乙個資料後,讓其上調,以調整順序

void push(const t& x)

t& top()

bool empty()

void disp(vectora, size_t k)//列印

cout <

}

在建堆時,首先來定義乙個下調函式_adjustdown();用來調整已實現大小堆順序。

實現思想:

1、找最後乙個非葉子結點

void _adjustdown(size_t parent)    //     下調

if (_com(_a[child],_a[parent]))

else}}

再寫乙個上調函式_adjustup()當push乙個數時,讓它上調,以調整整個堆的順序。

實現思想:

1、上調,傳當前結點,令當前節點為孩子結點,上一結點為父結點,

注意:在此不用考慮左右子數誰大誰小,上調是如果孩子結點比父結點大,那它肯定比兄弟結點大。

void _adjustup(size_t child)   //上調

else}}

三、優先佇列

templateclass compare = big>//利用模板的模板引數

class priorityqueue  //優先佇列

void pop()

t& top() };

測試用例:

priorityqueues;

s._push(3);

s._push(12);

s._push(5);

s._push(78);

s._push(43);

s._push(10);

s._push(32);

結果會以大堆形式實現為:

如果將測試用例改為:

priorityqueues;

s._push(3);

s._push(12);

s._push(5);

s._push(78);

s._push(43);

s._push(10);

s._push(32);

結果會以小堆實現 為:

本文出自 「土豆_」 部落格,請務必保留此出處

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

堆 可視為一棵完全二叉樹結構,最小堆每個父節點都小於孩子結點,最大堆每個父節點都大於孩子結點。建堆思想 實現向下調整演算法adjustdown 即當乙個節點的左子樹和右子樹都已為最大堆或最小堆 在這裡則尋找樹倒著走的第乙個非葉子結點,依次進行調整 比較其左右孩子結點滿足大堆或小堆要求的節點,再與此節...

優先佇列的實現(最小堆)

定義上浮函式和下浮函式,對每一次加入的新節點,重新維護最小堆 public class priorityminqueue public priorityminqueue 初始化優先佇列 param capacity public priorityminqueue int capacity else ...

最小堆及基於最小堆的最小優先佇列

最小堆具有的性質 最小堆的父親節點比子節點的值小 在最小堆的類中我們定義的函式主要有 維護最小堆 建立最小堆和利用最小堆進行排序 以下是最小堆的定義 ifndef my min heap h define my min heap h include includeusing namespace st...