資料結構 堆的常規操作(建堆,刪除,插入)

2021-10-02 08:39:15 字數 1165 閱讀 7569

寫在前面:該篇文章**柳婼【資料結構】堆、堆排序筆記

堆的一些性質:

堆是一棵完全二叉樹,樹的每個結點的值都不小於(或者不大於)其左右孩子的值。

父親結點大於等於孩子結點的值叫做大頂堆,反之叫做小頂堆

大頂堆的每個結點的值都是以它為根結點的子樹的最大值,反之最小值

下面都以大頂堆為例子:

兩個兄弟之間不存在大小比較關係,堆只能說明某結點引導的子樹的所有子結點都比它小,就像領導關係一樣,下屬之間或者領導之間可能有實力高低,但是領導是他的所有下屬的最高端

建堆:把所有非葉子結點都向下調整(從n/2開始直到1)

void createheap()

向下調整:(不斷和自己的左右孩子比較,把孩子的最大值和自己交換,直到結點的下標大於最後乙個元素的陣列下標high為止。記住:i結點的左孩子j結點滿足j = i * 2;)

const int maxn = 100;

int heap[maxn], n = 10;

//對heap陣列在[low, high]範圍進行向下調整,其中low為欲調整的結點的陣列下標,high一般為堆的最後乙個元素的陣列下標

void downadjust(int low, int high) else

}}

刪除堆頂元素(用最後乙個元素覆蓋堆頂元素,然後讓n- -,然後向下調整)

void deletetop()
增加乙個元素(新增到最後乙個結點的後面,然後進行向上調整操作)

void insert(int x)
向上調整操作就是把將要調整的結點與父親結點比較,如果權值比父親結點大,那麼就交換其與父親結點,這樣反覆比較,直到到達堆頂或者是父親結點的權值比較大為止

void upadjust(int low, int high)  else 

}}

堆排序:

在建堆完畢後,堆排序就是取出堆頂元素,然後將堆的最後乙個元素i替換至堆頂,再進行一次針對堆頂元素1向下調整(1, i – 1)範圍,直到堆中只有乙個元素為止(i == 2)

void heapsort() 

}

資料結構 堆的刪除

實現在最小堆中刪除給定序號為pos的元素,並由x返回,刪除成功返回true,失敗返回false。注意 刪除後要保持資料結構是最小堆。在最小堆中刪除給定序號為pos的元素,我們可以先刪除該元素後將堆中最後乙個元素補到該位子,然後向下調整為堆,在從該位置向上調整為堆。1 如果堆空返回false 2 x ...

資料結構 篩選法建堆

首先將n個資料元素存入乙個一維陣列,並把這個陣列視作一棵完全二叉樹。從二叉樹的最後乙個非葉結點開始用從上向下過濾的方法調整以該非葉結點為根節點的二叉樹為最大堆。對前面的結點依次執行2的操作直到根結點執行完成為止。此時這棵二叉樹就調整為了乙個最大堆。注 從上向下過濾是指從二叉樹的根結點開始,比較根結點...

資料結構 堆的操作

堆是指乙個完全二叉樹,它的某個結點的值總是不大於,或不小於其父節點的值,堆分為大堆和小堆,小堆堆頂元素一定是最小的,堆頂到每個葉子結點的路徑是公升序的,大堆則相反。堆的操作主要包括堆的建立,插入元素,刪除元素,返回堆頂元素等操作,其中,堆的建立要用到向下調整演算法,插入要用到向上調整演算法,具體操作...