建堆的兩種方式
自上而下
這種方式的思路是,每插入一個節點,就向上比較,判斷是否需要與其父節點進行交換,
分析這種方式的時間複雜度,假設樹的高度為h,以下均考慮最壞情況,也就是每一個節點都調整到根
第一層的1個節點不需要調整
第二層的2個節點,每個節點向上調整1次,2*1,
第三層的4個節點,每個節點向上調整2次,4*2,
第四層的8個節點,每個節點向上調整3次,8*3,
...
第h層的2^(h-1)
個節點,每個節點向上調整h-1
次,2^(h-1)*(h-1)
累計,
T(n) = 2^(1)*1
+2^(2)*2
+2^(3)*3
+2^(4)*4
+...+2^(h-1)*(h-1)
2*T(n) = 2^(2)*1
+2^(3)*2
+2^(4)*3
+2^(5)*4
+...+2^(h-1)*(h-2)
+2^(h)*(h-1)
用T(n)-2*T(n),
T(n)-2*T(n) = 2^1
+2^2
+2^3
+...+2^(h-1)
-2^(h)*(h-1)
= 2^h-2
-2^h*(h-1)
把h=log2(n)
代入
= 2^(log2(n))-2
-2^(log2(n))*(log2(n)-1)
= n-2-n*(log2(n)-1)
保留最高項
T(n) = O(nlog2(n))
自下而上
先建立完全二叉樹,然後從最後一個有葉子結點的節點開始向前調整。
時間複雜度分析,假設樹的高度為h,
第一層有1個節點,向下調整h-1次,1*(h-1)
第二層有2個節點,向下調整h-2次,2*(h-2)
第三層有4個節點,向下調整h-3次,4*(h-3)
第四層有8個節點,向下調整h-4次,8*(h-4)
...
第h-1
層有2^(h-2)
個節點,向下調整1
次,
第h
層有2^(h-1)
個節點,向下調整0
次,
T(n)
= 2^0*(h-1)
+2^1*(h-2)
+2^2*(h-3)
+2^3*(h-4)
+...+2^(h-2)*1
2*T(n)
= 2^1*(h-1)
+2^2*(h-2)
+2^3*(h-3)
+2^4*(h-4)
+...+2^(h-2)*2
+2^(h-1)*1
2*T(n)
-T(n)
= -(h-1)
+ 2+2^2+2^3+2^4+...+2^(h-2)
+2^(h-1)
= -(h-1)
+2^h-2
帶入h = log2(n)
T(n) = -(log2(n)-1)
+n-2
保留最高項
T(n) = O(n)