我們期望的資料結構能支援插入操作,並能方便地從中取出具有最小或最大關鍵碼的記錄,這樣的資料結構即為優先順序佇列。在優先順序佇列的各種實現中,堆是最高效的一種資料結構。
最小堆:任一結點的關鍵碼均小於或等於它的左右子女的關鍵碼,位於堆頂的結點的www.cppcns.com關鍵碼是整個元素集合的最小的,所以稱它為最小堆。最大堆類似定義。
建立堆:採用從下向上逐步調整形成堆得方法來建立堆。為下面的分支結點呼叫下調演算法siftdown,將以它們為根的子樹調整為最小堆。從區域性到整體,將最小堆逐步擴大,直到將整個樹調整為最小堆。
插入乙個元素:最小堆的插入演算法呼叫了另一種堆得調整方法siftup,實現自下而上的上滑調整。因為每次新結點總是插在已經建成的最小堆後面,這時必須遵守與sift相反的比較路徑,從下向上,與父結點的關鍵碼進行比較,對調。
刪除乙個元素:從最小堆刪除具有最小關鍵碼記錄的操作時將最小堆的堆頂元素,即其完全二叉樹的順序表示的第0號元素刪去,去把這個元素取走後,一般以堆得最後乙個結點填補取走的堆頂元素,並將堆的實際元素個數減1.但是用最後乙個元素取代堆頂元素將破壞堆,需要呼叫siftdown演算法進行調整堆。
本文**均以最小堆的實現為例。
複製** **如下:
#include
#include
usingnamespace std;
constint maxheapsize=100;
staticint currentsize=0;
//從上到下調整堆
void siftdown(int* heap,int currentpos,int m)
}heap[i]=temp;
}//從下向上調整堆
void siftup(int* heap, int start)
elsebreak;
}www.cppcns.com heap[i]=temp;
}//構建堆
int* heap(int*arr, int size)
return heap;
}//增加乙個元素
void insert(int* hea程式設計客棧p,int value)
heap[currentsize]=value;
siftup(heap,currentsize);
currentsize++;
}//刪除乙個元素,並返回刪除前的堆頂元素
int removemin(int* heap)
int main()
; int* heap=heap(arr,size);
//堆排序
for(int i=0;i
delete heap;
return0;
}
本文標題: 基於堆的基本操作的介紹
本文位址:
堆的基本操作
堆的基本概念 如果有乙個關鍵碼的集合k 把它的所有元素按完全二叉樹的順序儲存方式儲存在乙個一維陣列中,並滿足 ki k2 i 1 且 ki k2 i 2 ki k2 i 1 且 ki k2 i 2 i 0,1,2 則稱為小堆 或大堆 如下圖 分別為小堆和大堆 堆的操作具體 如下 測試環境 vs201...
堆的基本操作
堆的資料結構 對於堆,有最大堆和最小堆,在定義乙個堆的時候用乙個陣列表示堆,同時為了方便定義堆的大小,用乙個 size 表示堆的有效元素,同時為了區別最大堆和最小堆,我們用乙個函式指標表示這個堆是最大堆還是最小堆.typedef int compare heaptype parent,heaptyp...
堆的基本操作
heap.h ifndef heap h define heap h 定義乙個函式指標 typedef int pf hdatatype left,hdatatype right typedef int hdatatype typedef struct heap heap int greater h...