堆 其實就是一棵完全二叉樹(見下圖)在陣列中的實現
堆分為大根堆和小根堆
大根堆:1.根節點最大 2.子節點必須大於等於父節點
小跟堆:1.根節點最小 2.子節點必須小於等於父節點
在陣列中儲存這種結構時,總是習慣將根節點儲存在陣列下標為1的位置
每乙個下標為k的節點的父節點的下標就是k/2
每乙個下標為k的節點的子節點的下標就是k*2和 k * 2+1
在對堆進行操作(插入或刪除了乙個元素)的時候,有時會打破堆的有序性,使得子節點和父節點之間的有序性被打破,這時候就需要重新恢復堆的有序性。
恢復堆的有序性需要兩個核心的方法
一、上浮(以大根堆為例)
void
swim
(int x)
//x為要進行上浮操作的元素在陣列中的下標
}
二、下沉 (以大根堆為例)
void
sink
(int x)
else
}else
}}
三、插入元素(從0開始構建乙個堆)
假設要從鍵盤輸入n個數,然後以這n個數構建乙個大根堆
構建堆的基本思想就是將要插入的元素插入到陣列的末尾
然後對這個元素進行上浮操作
**如下
//n用來表示堆的最大下標
int n,n=
0,a[10]
;cin>>n;
int t;
while
(n--
)exch(1
,n);
n--;
sink(1
)
C語言資料結構堆的基本操作實現
目錄 void adjustdown datetype a,int n,int parent if a parent a child else 注意 if裡面的條件語句 child 1 void adjustup datetype a int child else 注意 while裡面的條件語句是不...
資料結構 堆的理解和基本操作
一.堆的概念 如果有乙個關鍵碼的集合k 把他所有元素按照完全二叉樹的順序儲存方式儲存在乙個一維陣列中,並滿足 ki k2 i 1 且 ki k2 i 2 ki k2 i 1 且 ki k2 i 2 i 0,1,2 則稱為小堆 或大堆 小堆 從上圖可以看出小堆的特點是 任意一節點的數值都要大於堆頂的結...
資料結構 堆的操作
堆是指乙個完全二叉樹,它的某個結點的值總是不大於,或不小於其父節點的值,堆分為大堆和小堆,小堆堆頂元素一定是最小的,堆頂到每個葉子結點的路徑是公升序的,大堆則相反。堆的操作主要包括堆的建立,插入元素,刪除元素,返回堆頂元素等操作,其中,堆的建立要用到向下調整演算法,插入要用到向上調整演算法,具體操作...