5.15 訓練日誌

      總結一下最近學的數據結構——堆。
      堆數據結構是一種數組對象,它可以被視爲一科完全二叉樹結構。它的特點是父節點的值大於(小於)兩個子節點的值(分別稱爲大頂堆和小頂堆)。它常用於管理算法執行過程中的信息,應用場景包括堆排序,優先隊列等。
      堆是一棵完全二叉樹,高度爲O(lg n),其基本操作至多與樹的高度成正比。
      get操作

void Heapify(int A[],int i)
{
int l=LEFT(i);
int r=RIGHT(i);
int largest;
if(l<=HEAP_SIZE(A)) largest=A[l]>A[i]?l:i;
if(r<=HEAP_SIZE(A)) largest=A[r]>A[largest]?r:largest; //從i,2i,2i+1中找出最大的一個
if(largest!=i) //i不是最大的
{
swap(A[i],A[largest]);
Heapify(A,largest); //交換後,子樹有可能違反最大堆性質
}
}
put操作
void Insert(int A[], int i) { //i爲插入的值
int n=++HEAP_SIZE(A);
A[n] = -99999;//小無窮
int p = n;
while(p >1 && A[PARENT§] < i) {
A[p] = A[PARENT§];
p = PARENT§;
}
A[p]=i;
}
新建堆操作
void BuildHeap(int A[],)
{
int i;
for(i = HEAP_SIZE(A)/2; i>=1; i–)
Heapify(A, i);
}
堆排序
void HeapSort(int A[])
{
BuildHeap(A);
for(i=HEAP_SIZE(A),i>1; i–)
{
swap(A[1],A[i]);
HEAP_SIZE(A)=HEAP_SIZE(A)-1;
Heapify(A,1); //交換後新的根元素可能委培了最大堆的性質
}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章