《啊哈!演算法》第7章 神奇的樹

2022-05-27 23:03:10 字數 1230 閱讀 9658

把n個元素建立乙個堆,首先將這n個結點以自頂向下、從左到右的方式從1到n編碼,這樣可以把n個結點轉換成一顆完全二叉樹

緊接著從最後乙個非葉子結點(結點編號為n/2)開始到根節點(結點編號為1),逐個掃瞄所有結點,根據需要將當前結點向下調整,直到以當前結點為根結點的子樹符合堆的特性。

#include #include 

#include

using

namespace

std;

//向下調整函式

void shiftdown(vector& a, int n,int

index)

else

break

; }}//

刪除最大的元素

int deletemax(vector& a , int&n)

//向上調整函式

void shiftup(vector& a, int n, int

index)}//

建立堆void make_heap(vector& a, int

n)

}void heap_sort(vector&a)

}int

main()

//建堆

make_heap(a,n);

heap_sort(a);

for(int i = 1 ; i <= n; ++i)

cout

<

int num =n;

for(int i = 1; i <= n; ++i)

}

堆排序並查集的優化有兩種,一種是路徑壓縮,一種是按秩合併,具體的可以參考《演算法導論》

/*

*並查集操作 */

#include

#include

#include

using

namespace

std;

int f[1000]=;

void make_set(int

size)

//採用路徑壓縮的方法查詢元素

int find_set(intx)}

void union_set(int x, inty)}

intmain()

int sum = 0

;

for(int i = 1; i<= n; ++i)

cout

return0;

}

並查集

《啊哈!演算法》第4章 萬能的搜尋

第5節 寶島探險 利用廣度優先搜尋實現 其中可以不用開闢visit變數,直接用將本身的值改為 1,然後判斷即可 注意輸入資料時周圍加了一層 1,作為邊界 廣度優先搜尋 利用深度優先搜尋實現,注意下面的方法是將搜尋到的點著成 1的顏色 深度優先搜尋 注意如果n和m比較大的話,建議用廣度優先搜尋,由於深...

啊哈!演算法 演算法11 堆 神奇的優先佇列(上)

堆是什麼?是一種特殊的完全二叉樹,就像下面這棵樹一樣。有沒有發現這棵二叉樹有乙個特點,就是所有父結點都比子結點要小 注意 圓圈裡面的數是值,圓圈上面的數是這個結點的編號,此規定僅適用於本節 符合這樣特點的完全二叉樹我們稱為最小堆。反之,如果所有父結點都比子結點要大,這樣的完全二叉樹稱為最大堆。那這一...

啊哈!演算法 演算法11 堆 神奇的優先佇列(上)

堆是什麼?是一種特殊的完全二叉樹,就像下面這棵樹一樣。有沒有發現這棵二叉樹有乙個特點,就是所有父結點都比子結點要小 注意 圓圈裡面的數是值,圓圈上面的數是這個結點的編號,此規定僅適用於本節 符合這樣特點的完全二叉樹我們稱為最小堆。反之,如果所有父結點都比子結點要大,這樣的完全二叉樹稱為最大堆。那這一...