最小堆是一顆完全二叉樹,他的每乙個節點的值不大於其左右子節點的值。
leaf_name=['a','b','c','d','e','f','g','h'];
leaf_data=[10,1,1,11,1,1,8,5];
my_heap=heap();
my_heap.min_heap_create(leaf_name,leaf_data);
函式定義如下:
function heap = heap()
heap.size=0;
heap.name=;
heap.data=;
endfunction min_heap_create(heap,name,data)
n=length(name);
for n=1:n
heap.name(n)=name(n);
heap.data(n)=data(n);
heap.size=heap.size +1;
endend
執行結果如下:
node 1–>a–>10
node 2–>b–>1
node 3–>c–>1
node 4–>d–>11
node 5–>e–>1
node 6–>f–>1
node 7–>g–>8
node 8–>h–>5
圖狀表示如下:
因為最小堆的子樹也是最小堆,所以可以從底部開始建立,採用節點下沉演算法。如果子節點的值比本身小,將左右子節點中最小的乙個和本身交換,相等的情況下左子節點優先交換。逐步下降,直到本身的節點不大於子節點停止。**如下:
function heap_down_sink(heap,self)
lchild =self*2;
rchild =self*2+1;
if(lchild <= heap.size && rchild <= heap.size)
if(heap.data(self) > heap.data(lchild) || heap.data(self) > heap.data(rchild))
if(heap.data(lchild) <= heap.data(rchild))%左右子樹相等的情況下,優先往左子樹下沉
heap_swap_node(heap,lchild,self);
heap_down_sink(heap,lchild);
else
heap_swap_node(heap,rchild,self);
heap_down_sink(heap,rchild);
endend
elseif(lchild <= heap.size)%僅僅只存在左葉子樹
if(heap.data(self) > heap.data(lchild))
heap_swap_node(heap,lchild,self);
endend
end
利用上面的節點下降演算法調整二叉堆,使之滿足最小堆的特性。方法是從最後乙個節點開始,逐個執行節點下沉演算法,就可以實現要求。函式如下:
function min_heap_adjust(heap)
n=heap.size;
while(n>=1)
heap_down_sink(heap,n)
n=n-1;
end
end
執行結果如下:
node 1–>b–>1
node 2–>e–>1
node 3–>c–>1
node 4–>h–>5
node 5–>a–>10
node 6–>f–>1
node 7–>g–>8
node 8–>d–>11
圖狀表示如下:
插入節點不能破壞堆的特性,因此首先將堆的長度增加乙個耽誤,然後新增最後乙個元素。因為只有新新增的節點可能不滿足位置要求,因此對該節點執行上浮操作。具體做法是如果他的值小於其父母節點的值,那麼交換兩者的值,直到不滿足條件為止,即可調整好最小堆。**如下:
function min_heap_insert(heap,name,data)
%新增的節點新增的尾部
heap.size=heap.size +1;
heap.name(heap.size)=name;
heap.data(heap.size)=data;
%新增的節點做上浮的動作,達到排序的效果
heap_up_float(heap,heap.size);
endfunction heap_up_float(heap,self)
while(self >=2)
parent=floor(self/2);
if(heap.data(self) < heap.data(parent))
heap_swap_node(heap,parent,self);
endself =parent;
end
end
執行my_heap.min_heap_insert(『n』,3)後,執行結果如下:
node 1–>b–>1
node 2–>e–>1
node 3–>c–>1
node 4–>n–>3
node 5–>a–>10
node 6–>f–>1
node 7–>g–>8
node 8–>d–>11
node 9–>h–>5
圖狀表示如下:
取出最小節點仍然不能破壞最小堆的結構,方法是將根節點和最後乙個節點交換,那麼最後乙個節點就最小的節點。然後將堆的長度減小1個單位,此時只有根節點可能不滿足最小堆的特性,執行節點下沉演算法,就可以滿足要求。**如下:
function min_heap_popup(heap)
heap_swap_node(heap,1,heap.size);%交換根節點和尾結點
heap.size =heap.size -1;
heap_down_sink(heap,1);%根節點下沉
end
執行my_heap.min_heap_popup()後運算結果如下:
node 1–>e–>1
node 2–>n–>3
node 3–>c–>1
node 4–>h–>5
node 5–>a–>10
node 6–>f–>1
node 7–>g–>8
node 8–>d–>11
圖狀表示如下
最小堆建立
題目 實現最小堆兩個功能 1 增加乙個元素 2 輸出並刪除最小堆中的最小的數 輸入 第一行輸入乙個整數t,代表測試資料的組數。對於每組測試資料,第一行輸入乙個整數n,代表操作的次數。每次操作首先輸入乙個整數type。當type 1,增添操作,接著輸入乙個整數u,代表要插入的元素。當type 2,輸出...
最小堆怎麼建立
有乙個面試題,100w個數中找到最大的100個數。解決方式是,用乙個100個容量的最小堆,這100個數總數目前已知的最大的100個,而且 堆頂是小的,在繼續遍歷時候,只和堆定比較,如果這個數,比堆頂的大,就把這個數加入 這個堆。當遍歷完成後,這個最小堆中的數,就是最大的100個數了。當理解了這個,我...
最小堆的實現
這邊實現的是最小堆,最小堆是這樣定義的,首先堆是一棵完全二叉樹,每乙個節點都有乙個權值,滿足的條件是,父節點的權值總是大於等於子節點的權值 include using namespace std 最小堆類的定義如下 template class minheap template void minhe...