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