堆使用完全二叉樹的結構進行儲存,根據完全二叉樹的性質,在堆中給定下標為i的節點時:
如果i=0,節點i是根節點;否則節點i的父節點為節點(i-1)/2
如果2i+1>n-1,則節點i無左子女;否則節點i的左子女為2i+1
如果2i+2>n-1,則節點i無右子女;否則節點i的右子女為2i+2
typedef struct message
e;
#define defaultsize 100000
class
minheap
//析構函式
bool insert
(const
e& x)
;//將x插入到最小堆中
bool remove(e
& x)
;//刪除堆頂元素,並通過x返回
private
:void
siftdown
(int start, int m)
;//從start到m下滑調整成為最小堆
void
siftup
(int start)
;//從start到0向上調整成為最小堆
};
1.建構函式,建立乙個sz大小的陣列空間,初始化陣列大小為0,通過插入操作對堆進行賦值
minheap:
:minheap
(int sz)
currentsize =0;
//建立當前大小
}
2.siftdown函式
void minheap:
:siftdown
(int start, int m)
if(temp <= heap[j]
)break
;//如果根節點比子女小,則不做調整
else
} heap[i]
= temp;
//回放temp中暫存的元素
}
3.siftup函式
void minheap:
:siftup
(int start)
} heap[j]
= temp;
//回送
}
4.minheap的插入函式
bool minheap:
:insert
(const
e& x)
heap[currentsize]
= x;
//插入
siftup
(currentsize)
;//向上調整
currentsize++
;//堆計數加1
return
true
;}
5.minheap的刪除函式
bool minheap:
:remove(e
& x)
x = heap[0]
; heap[0]
= heap[currentsize -1]
;//返回並刪除堆頂元素,用最後乙個元素填補根節點
currentsize--
;//最小堆計數減1
siftdown(0
, currentsize -1)
;//自上而下調整最小堆
return
true
;}
堆的建立,插入,刪除
堆的概念 如果有乙個關鍵碼的集合k 把它的所有元素按完全二叉樹的順序儲存方式儲存在乙個一維陣列中,並滿足 ki k2 i 1 且ki k2 i 2 i 0,1,2 則稱這個堆為最小堆 或者最大堆 其實這麼多乾乾的概念還是很不好理解的 先來說一下什麼是完全二叉樹 如果一顆具有n個結點的二叉樹的結構與滿...
堆的建立 刪除 插入
我們知道在c語言中也有乙個名字叫做堆,那麼在資料結構中的堆和c語言中的堆一樣嗎?答案是 no c語言中的堆 其實是因為有一堆東西在此放著,所以起名為堆 資料結構的堆 如果有乙個關鍵碼的集合k 把它的所有元素按完全二叉樹的順序儲存方式儲存在乙個一維陣列中,並滿足 ki k2 i 1 且 ki k2 i...
堆的建立,插入,刪除,排序
堆是一種完全二叉樹,有最小堆和最大堆之分,最小堆是指根節點的值一定小於左子樹和右子樹所有元素的值,最大堆則相反 當你從小到大排序時,可以選擇最小堆反之,則選擇最大堆 1.如何建立乙個最小堆呢 由於堆是乙個完全二叉樹,所以滿足以下關係 我們將元素的順序從0開始排,第i個節點稱之為ki,那麼元素就有k0...