最大堆max heap最小堆min heap

2022-06-21 06:36:11 字數 1769 閱讀 8082

堆(heap)是電腦科學中一類特殊的資料結構的統稱,堆通常是乙個可以被看做一棵樹的陣列物件。

1、堆是一棵完全二叉樹;

2、堆中的某個結點的值總是大於等於(最大堆)或小於等於(最小堆)其孩子結點的值。

3、堆中每個結點的子樹都是堆樹。

最大堆max-heap:每個節點的鍵值(key)都大於或等於其子節點鍵值

最小堆min-heap:每個節點的鍵值(key)都小於或等於其子節點鍵值

完全二叉樹整棵樹內沒有任何節點漏洞,這帶來乙個好處:我們可以利用array來儲存所有節點。假設我們動用乙個小技巧,將array的#0元素保留(或設為無限大值或無限小值),那麼完全二叉樹中的某個節點位於array的i處時,其左子節點位於array的2i處,其右子節點位於array的2i+1處,其父節點位於「i/2"。

注:完全二叉樹:若二叉樹的深度為h,則除第h層外,其他層的結點全部達到最大值,且第h層的所有結點都集中在左子樹。

堆通常是乙個可以被看做一棵樹的陣列物件,所以它的結構就並不是左指標和右指標了,而是以陣列的形式,而且為了方便後面的操作(像插入、刪除...),堆的結構中還有size代表它當前的長度和capacity代表它的總容量:

struct

maxheap

;maxheap h;

1、構造最大堆

基本思想:首先將每個葉子結點視為乙個堆,再將每個葉子結點於其父節點一起構成乙個包含更多結點的堆。所以在構造堆的時候,首先需要找到最後乙個結點的父節點,從這個節點開始構造最大堆,直到該節點前面的所有分支節點都處理完畢。

注意: 在二叉樹中,若當前節點的下標為 i, 則其父節點的下標為 i/2,其左子節點的下標為 i*2,其右子節點的下標為i*2+1;

2、初始化堆

void maxheapinit(maxheap &h)

}h.heap[son/2]=h.heap[0

]; }

}

3、最大堆中插入節點

最大堆中插入節點,先在堆末尾插入該節點,然後按照堆的初始化過程將該節點放入到合適的位置。

void maxheapinsert(maxheap &h, etype &x)

h.heap[i]=x;

return

true

;}

4、最大堆刪除節點

將最大堆的最後乙個節點放到根節點,然後刪除最大值,然後再把新的根節點放到合適的位置。

void maxheapdelete(maxheap &h, etype &x)

h.heap[i]=h.heap[0

];

return

true

;

}

5、堆排序

#includeusing

namespace

std;

void swap(int &a, int &b)

void quick_build(int a, int len, int

root)

if(a[root]

void quick_sort(int a, int

len)

}

參考:1. 最大/小堆(heap)的實現 - 知乎

2. 深入理解堆(最大堆,最小堆及堆排序)

最大堆 最小堆

堆是一種經過排序的完全二叉樹,其中任一非終端節點的資料值均不大於 或不小於 其左孩子和右孩子節點的值。最大堆和最小堆是 二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵值中最大者。最小堆 根結點的鍵值是所有堆結點鍵值中最小者。而最大 最小堆集結了最大堆和最小堆的優點,這也是其名字的由來。最大 最...

最大堆 最小堆

堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點分別是節點i的左...

最大堆 最小堆

堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點分別是節點i的左...