数据结构-堆(最大堆)
生活随笔
收集整理的這篇文章主要介紹了
数据结构-堆(最大堆)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最大堆
實質是一棵完全二叉樹
每個根結點元素的值都比左右兒子的大
每次都是取出堆頂元素(可以說是優先隊列)
代碼
參考自浙大數據結構
#include <iostream> #include <cstdio> #include <algorithm> #define ERROR -1 const int MAXDATA = 1<<30; using namespace std; typedef int ElementType; typedef struct HeapStruct *MaxHeap; struct HeapStruct {ElementType *Elements; /*存儲元素的數組*/int Size; /*當前堆元素個數*/int Capacity; /*堆的最大容量*/ };/*建堆(申請需要的內存)*/ MaxHeap Creat(int MaxSize) {/*創建容量為MaxSize的最大堆*/MaxHeap H = (MaxHeap)malloc(sizeof(struct HeapStruct));H->Elements = (ElementType*)malloc((MaxSize+1)*sizeof(ElementType));H->Size = 0;H->Capacity = MaxSize;H->Elements[0] = MAXDATA; /*定義哨兵為大于所有可能元素的值,以便后面更快操作*/return H; }bool IsFull(MaxHeap H) {return H->Size == H->Capacity; } bool IsEmpty(MaxHeap H) {return H->Size == 0; }void Insert(MaxHeap H,ElementType item) {int i;if(IsFull(H)){printf("最大堆已滿!\n");return;}i = ++H->Size; /*指向堆中最后一個元素的位置*/for( ; H->Elements[i/2] < item; i/=2){H->Elements[i] = H->Elements[i/2]; /*下移小的item*/}H->Elements[i] = item; /*將item插入*/ }ElementType Delete(MaxHeap H) {if(IsEmpty(H)){printf("最大堆為空!\n");return ERROR;}int Parent,Child; /*parent指定最后一個元素temp放的位置*/ElementType MaxItem,temp;MaxItem = H->Elements[1]; /*取出根節點最大值*/temp = H->Elements[H->Size--]; /*用最大堆中最后一個元素從根結點開始向上過濾下層結點*/for(Parent = 1; Parent*2 <= H->Size; Parent = Child){Child = Parent * 2;if((Child < H->Size)&&(H->Elements[Child] < H->Elements[Child+1]))Child++; /*Child指向左右結點較大者*/if(temp >= H->Elements[Child]) break;else /*移動temp到下一層:Parent = Child*/H->Elements[Parent] = H->Elements[Child];}H->Elements[Parent] = temp;return MaxItem; } void PushDown(MaxHeap H,int p) {/*將H中以p為根結點的堆調整為最大堆*/int Parent,Child;ElementType X = H->Elements[p]; /*取根結點存放的值*/for(Parent = p; Parent * 2 <= H->Size; Parent = Child){Child = Parent * 2;if((Child < H->Size) && (H->Elements[Child] < H->Elements[Child+1]))Child++; /*指向更大的結點*/if(X >= H->Elements[Child]) break;else H->Elements[Parent] = H->Elements[Child];/*調整*/}H->Elements[Parent] = X; }/*根據輸入的數據構建好MaxHeap*/ void BuildHeap(MaxHeap H) {/*與刪除一個元素的調整策略相同從最后一個子堆根結點開始依次調整堆*/for(int i = H->Size/2; i > 0; --i){PushDown(H,i);} } int main() {MaxHeap H = Creat(100);H->Size = 10;for(int i = 1; i <= 10; ++i){H->Elements[i] = i;}BuildHeap(H);Insert(H,2021);Insert(H,1998);while(!IsEmpty(H)){printf("%d\n",Delete(H));}return 0; }總結
以上是生活随笔為你收集整理的数据结构-堆(最大堆)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PTA 1002 Business (3
- 下一篇: 深化对KMP算法的理解