heap:堆
堆是一種建立在樹上的結構,是一種完全二叉樹型的資料結構,目前了解到的應用是堆排序,然後用於實現優先佇列。堆的特點是,子結點一定比父結點大或者小於父結點。其中,所有子結點都小於父結點的堆是最大二叉堆,子結點小於父結點的是最小二叉堆。
堆的核心是heapify,維護堆合法性的演算法;後續談到的建立堆,堆排序,堆中插入元素,刪除元素都離不開維護堆合法性。所以在一開始打算談一下如何維護堆的合法性。
這裡用到陣列來模擬二叉堆。為所有的結點編號。那麼任取乙個結點,若該結點有子結點,則該結點的左子結點編號為父結點編號*2,右結點為其父結點編號*2+1。那麼維護堆合法性就需要將選定結點與其子結點進行比較。以最大二叉堆為例,選出父結點,子結點中值最大的點,若該點不為父結點,則將該結點與父結點交換,並考慮交換後原交換結點處的合法性。**如下:
void heapify(int *a,int i,int n)
在乙個二叉堆中對於高度為h的堆,其第i層最多含有2^(i-1)個結點,且堆是一種完全二叉樹型的資料結構。那麼,h層的結點編號為2^(h-1)~2^h-1。一共有n個結點,那麼n/2~n為葉子結點。對於這些結點可以看做僅含乙個結點的子堆。那麼從他們的父結點開始向上層考察堆的合法性,每次可以保證,從考察結點開始的子堆在合法性維護結束後,該子結點一定是合法的。那麼考察到最頂層後,整個堆就是合法的。
堆排序是一種基於堆結構的排序方法。核心思想是取出堆頂元素,與最後乙個元素交換位置,將元素數量減一,然後維護堆的合法性。
void heapsort(int *a,int &n)
}
學習筆記 堆
include include typedef struct node minheap 初始化乙個堆 void create minheap h,int maxsize bool isfull minheap h 往堆裡插入資料,其實可以直接在主程式裡輸入就行了 void insert minhea...
堆學習筆記
完全二叉樹比較適合用陣列來儲存 堆化非常簡單,就是順著節點所在的路徑,向上或者向下,對比,然後交換。從堆的定義的第二條中,任何節點的值都大於等於 或小於等於 子樹節點的值,我們可以發現,堆頂元素儲存的就是堆中資料的最大值或者最小值 把最後乙個節點放到堆頂,然後利用同樣的父子節點對比方法。對於不滿足父...
堆 學習筆記
完全二叉樹形式 具有單調性 可以用來求最值 也可以用來求最值 大根堆 根節點最大 小根堆 根節點最小 借助vector來建堆 include using namespace std int main return 0 make heap a.begin a.end cmp bool cmp int ...