1. 程式人生 > 其它 >堆及堆的相關操作

堆及堆的相關操作

*優先佇列:特殊的“佇列”,取出元素的順序是依照元素的優先權大小,而不是元素進入佇列的先後順序。

優先佇列的完全二叉樹表示——堆的兩個特性:

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;//儲存堆元素的型別
          int
Size;//堆的當前元素個數 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;
}