堆 最大堆 最小堆的初始化 增加 刪除等基本操作

2021-08-29 03:52:03 字數 2123 閱讀 7881

堆的定義:堆是一種經過排序的完全二叉樹或滿二叉樹

最大堆:就是不不斷變得進行樹元素替換,最終是樹呈現上面數值最大;

最小堆:就是不不斷變得進行樹元素替換,最終是樹呈現上面數值最小;

堆的定義

堆是一種經過排序的完全二叉樹或滿二叉樹,n個元素的序列,當且僅當滿足如下關係時被成為堆(1)ki <= k2i 且 ki <= k2i-1或 (2) ki >= k2i 且 ki >= k2i-1(i = 1,2,…[n/2])當滿足(1)時,為最小堆,當滿足(2)時,為最大堆。

滿二叉樹即除最後一層無任何子節點外,每一層上的所有結點都有兩個子結點的二叉樹。

如下為乙個最大堆:用陣列則可以按順序表示堆{100,19,36,17,3,25,1,2,7}

堆的初始化

從乙個無序序列初始化為乙個堆的過程就是乙個反覆「篩選」的過程。由完全二叉樹的性質可以知,乙個有n個節點的完全二叉樹的最後乙個非葉節點是節點[n/2],堆的初始化過程就從這個[n/2]節點開始。上圖為如下無序陣列的初始化:

首先,未處理的陣列對應的堆為圖1模樣。從第四個節點開始([8/2]=4),因為50 < 97,故要交換兩節點,交換後還要繼續對其新的左子樹進行類似輸出後那樣的篩選。易見其左子樹只有節點97,已經為最佳情況,故可以繼續堆的初始化,如圖2。再考慮第三個節點,因為13 < 27 < 65,即節點13為當前的最小節點,故與節點65交換,並對新的左子樹進行篩選,其也為最佳情況,故可繼續堆的初始化,結果如圖3。然後考慮第二個節點,因為38 < 50 < 76,故已經為最優情況,不用調整。最後再考慮第乙個節點,根節點。因為 13

void initialize(t a, int size, int arraysize)  

//下移一層

} heap[c / 2] = y;

} }

堆的插入

最大堆的插入的思想就是先在最後的結點新增乙個元素,然後沿著樹上公升。跟最大堆的初始化大致相同。

maxheap&insert(const t&x)  

heap[i] = x; //這時候才把x放進去

return *this;

}

堆的輸出

圖1為乙個最小堆,當最小節點根節點13輸出後,將最後乙個節點97作為根節點,移到頂端,如圖2. 然後要對堆進行調整。比較此完全樹的根節點與其兩個子節點大小,因為27 < 38 < 97,所以27是三個節點裡最小的,將節點27與根節點97交換。此時以97替代27而產生的右子樹為乙個新的堆,再以97為根節點,對此最小堆進行調整,同理,知道要將97與49交換,得到圖3的完全樹。此時以97代替49為根節點的右子樹為乙個新堆,再對此堆做同樣的操作,因為此完全樹已經是最小堆,所以可以停止操作,堆的調整完畢。此時再將根節點,對的最小值輸出,並進行同樣的調整,可以得到如圖4的新堆。這個過程被稱為「篩選」。

簡而言之: 最大堆的刪除,即刪除最大的元素。我們先取第乙個元素並刪除,然後將最後的元素提到根結點(即第乙個元素),然後再把新的根節點放到合適的位置

maxheap&deletemax(t &x)  

else //能

break;

} heap[i] = y;

return *this;

}

總結:

初始化:從中間n/2位置從下往上遍歷。

增加:從下往上 類似初始化。

輸出:最後乙個移動到第乙個,從上往下遍歷。

應用:堆(通常是二叉堆)常用於排序。這種演算法稱作堆排序。

C Heap 堆的實現(最小堆 最大堆)

堆也叫優先佇列,堆是一種特殊的完全二叉樹資料結 堆分為兩種,最大堆,最小堆。最大堆 根節點大於左右兩個子節點的完全二叉樹 最小堆 根節點小於左右兩個子節點的完全二叉樹 堆可以用陣列來儲存,a i 處存根節點,a 2 i 存左子樹的根節點 a 2 i 1 存右子樹的根節點。i從1開始 元素下沉 voi...

堆(優先佇列,即最大堆,最小堆)

優先佇列 priority queue 特殊的 佇列 取出元素的順序是 依照元素的優先權 關鍵字 大小,而不是元素進入佇列的先後順序。堆的兩個特性 結構性 用陣列表示的完全二叉樹 有序性 任一結點的關鍵字是其子樹所有結點的最大值 或最小值 最大堆 maxheap 也稱 大頂堆 最大值 最小堆 min...

最大堆的初始化 插入和刪除

最大堆為完全二叉樹,採用陣列存放資料,父節點的值永遠比左右孩子大,但兄弟之間值的大小並不確定。heap.h ifndef heap h included define heap h included includeusing namespace std int const max 20 templa...