**:
[cpp]view plain
copy
print?
template
inline
void maxheap::make_heap(vector& v)
[cpp]view plain
copy
print?
template
inline
void maxheap::reheapify_down(int i) while (max != current);
}
看似建堆(make_heap)的複雜度為o(nlogn),實則為o(n),reheapify_down不會touch到每個節點,所以不算簡單的遞迴,只能算疊加。證明如下:
因為堆構建的是一顆平衡二叉樹。於是有:
1. 一棵擁有n個節點的平衡二叉樹,樹高 h 約為 lg n 。
2. 樹的第 i 層 最多有節點 2^i 個。注意,第 i 層的高度為 i + 1。如第0層的高度為1,擁有1個根節點。
那麼做reheapify_down時,最底層(h-1)的節點不會動,倒數第二層(h-2)的節點最多往下移動一次,倒數第三層(h-3)的節點最多往下移動2次....第0層的節點往下最多移動(h-1)次。
所以,最壞情況下,每層所有節點都會往下移到最底層。
則,所有操作總和為 s = 2^(h-1)*0 + 2^(h-2)*1 + 2^(h-3) * 2 + ... + 2^1*(h-2) + 2^0*(h-1) ----- (1)
把(1)式乘以2,再減去(1)式, 可得
s = 2^(h-1) + 2^(h-2) + ... + 2^1 - 2^0*(h-1) = 2(1-2^(h-1))/(1-2) - (h-1) = 2^h - h- 1 ---- (2)
把h = lg n 代入 (2)式, 得 s = n - lgn - 1 <= n (n >=1)
故而, 建堆複雜度為o(n) 。
水平有限,歡迎指正不對之處。
**
堆排序建堆的時間複雜度
建堆的過程,看起來外面一層迴圈o n 裡面是個logn的調整函式,時間複雜度貌似是nlogn的,但是仔細分析,其實質是o n 的。證明如下 首先,對於高度為h的完全二叉樹,其第i層的元素個數為2 i 1 對於堆的每一層,調整的深度都不一樣,每層的元素的調整深度小於等於h i,假設每層調整的深度是h ...
堆排序的時間複雜度分析
堆排序包括兩個階段,初始化建堆和重建堆。所以堆排序的時間複雜度由這兩方面組成,下面分別進行分析。先post乙個實現 便於分析。include void swap int a,int b void adjustheap int param1,int j,int innums void heapsort...
堆排序的時間複雜度分析
堆排序包括兩個階段,初始化建堆和重建堆。所以堆排序的時間複雜度由這兩方面組成,下面分別進行分析。先post乙個實現 便於分析。include void swap int a,int b void adjustheap int param1,int j,int innums void heapsort...