小根堆的性質:是完全二叉樹,根節點的關鍵字小於等於兩個子節點的關鍵字。
插入和刪除操作都應當保證小根堆的性質不變。
由於小根堆是完全二叉樹,所以使用陣列存放具有顯著優勢:按照層次遍歷將具有n個元素的小根堆的存放到陣列(命名為heap)的[1]~[n]項中。此時對於任一元素heap[i],其父節點為heap[i/2],其子節點為heap[i * 2] 和 heap[i*2+1]。
1、插入元素:從新的葉節點開始,向上考察其父節點,若父節點的關鍵字大於新節點的關鍵字,則二者交換位置,然後繼續向上考察;否則迴圈停止,插入位置確定。
2、刪除根節點(刪除最小節點):首先刪除heap[1],然後考察最後乙個葉節點能否填入空位(保證填入後依然是小根堆),如果能,則將該葉節點填入空位;如果不能,則將空位的兩個子節點中較小的乙個填入空位,然後對新的空位進行同樣的的操作。
3、將陣列堆化:從最後乙個有子節點的節點(由完全二叉樹的性質可知,該節點在陣列中的下標是節點個數長度/2)開始向前考察,對於考察到的每個節點,比較該節點的關鍵字與其較小子節點的關鍵字,若該節點的關鍵字更大,則二者交換位置,然後繼續比較該節點的關鍵字與新位置上較小子節點的關鍵字,直到該節點位置確定。
template
<
class
t>
class
mintree
//小根堆類
mintree
(t* theheap,
int thesize,
int thelength)
//利用已知陣列建立小根堆
heap[child /2]
= rootelement;}}
t front()
//獲取堆中首項,即最小值
bool
empty()
void
push
(const t& theelement)
//插入元素
heapsize++
;int currentnode = heapsize;
//新節點是最後乙個節點
while
(currentnode !=
1&& heap[currentnode /2]
> theelement)
//從新節點開始向上考察其父節點,若父節點比當前節點大,則交換位置
heap[currentnode]
= theelement;
}void
pop(
)//刪除最小元素,即刪除heap[1]
heap[1]
.~t(
);//重建小根堆,由於需要保持完全二叉樹的性質,所以在盡可能呼叫堆的最後乙個節點來補足空位
t lastelement = heap[heapsize]
; heapsize--
;int currentnode =1;
//此時該位為空,需要由最後乙個節點或子節點來補足
int child =2;
while
(child <= heapsize)
heap[currentnode]
= lastelement;
}private
: t* heap;
//堆中元素存放在陣列中
int arraylength;
//陣列容量
int heapsize;
//堆中元素個數
};
順序表的初始化 刪除 插入
初始化線性表 include include include define list init size 100 define listincrement 10 define ok 1 define error 0 define overflow 2 struct sqlist char elem ...
順序表的初始化 插入 刪除
昨天晚上做了中移動蘇州軟體公司的暑期實習崗的筆試題,感覺備受打擊,尤其是自以為是的資料結構題 從快排 歸併排序 堆排序中選一種實現 碎決定再次學習資料結構一次,並將重要的資料結構用程式實現。這裡先實現的是順序表的初始化,插入和刪除操作。include using namespace std 線性表的...
C 大根堆與小根堆
c 中,大根堆和小根堆可以使用優先佇列實現。include priority queuepq1 大根堆 priority queue,greater pq2 小根堆該stl支援自定義比較函式,但與sort不同,不支援直接使用lambda函式。自定義的小根堆如下。struct cmp 自定義小根堆 p...