堆及堆的相關操作
阿新 • • 發佈:2021-11-29
堆
*優先佇列:特殊的“佇列”,取出元素的順序是依照元素的優先權大小,而不是元素進入佇列的先後順序。
優先佇列的完全二叉樹表示——堆的兩個特性:
1,結構性:用陣列表示的完全二叉樹;
2,有序性:任一結點的關鍵字是其子樹所有節點的最大值(或最小值)
*“最大堆”,也稱“大頂堆”:最大值
*“最小堆”,也稱“小頂堆”:最小值
堆的抽象資料型別描述:
型別名稱:最大堆
資料物件集:完全二叉樹,每個節點的元素值不小於其子節點的元素值
操作集:最大堆H(-MaxHeap,元素item(-ElementType,主要操作有:
*MaxHeap Create(int MaxSize):建立一個空的最大堆。
*Boolean IsFull(MaxHeap H):判斷最大堆H是否已滿。
*Insert(MaxHeap H,ElementType item):將元素item插入最大堆H。
*Boolean IsEmpty(MaxHeap H):判斷最大堆H是否為空。
*ElementType DeleteMax(MaxHeap H):返回H中最大元素(高優先順序)。
最大堆的建立:
typedef struct HeapStruct *MaxHeap; struct HeapStruct{ ElementType *Elements;//儲存堆元素的型別 intSize;//堆的當前元素個數 int Capacity;//堆的最大容量 };
MaxHeap Create(int MaxSize) {//建立容量為MaxSize的空的最大堆 MaxHeap H=malloc(sizeof(struct HeapStruct)); H->Elements=malloc((MaxSize+1)*sizeof(ElementType)); H->Size=0; H->Capacity=MaxSize; H->Elements[0]=MaxData;//定義”哨兵”為大於堆中所有可能元素的值,便於以後更快操作return H; }
最大堆的插入:
void Insert(MaxHeap H,ElementType item) {//將元素item插入到最大堆H,其中H->Elements[0]已經定義為哨兵 int i; if(IsFull(H)){ printf("最大堆已滿“); return; } i=++H->Size;//i指向插入後堆中的最後一個元素的位置 for( ;H->Elements[i/2]<item;i/=2) H->Elements[i]=H->Elements[i/2];//向下過濾結點 H->Elements[i]=item;//將item插入 }
最大堆的刪除:取出根節點(最大值)元素,同時刪除堆的一個結點。
ElementType DeleteMax(MaxHeap H) {/*從最大堆H裡面取出鍵值為最大的元素,並刪除一個節點*/ int Parent,Child; ElementType MaxItem temp; if(IsEmpty (H)){ printf("堆疊已經為空"); return ; } 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到元素到下一層*/ H->Elements[Parent]=H->Elements[Child]; } } H->Elements[Parent]=H->Elements[Child]; return MaxItem; }