堆排序中 建堆的演算法複雜度分析O n

2021-06-18 04:32:10 字數 1061 閱讀 9585

**:

[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...