建堆的過程,看起來外面一層迴圈o(n),裡面是個logn的調整函式,時間複雜度貌似是nlogn的,但是仔細分析,其實質是o(n)的。
證明如下:
首先,對於高度為h的完全二叉樹,其第i層的元素個數為2^(i-1),對於堆的每一層,調整的深度都不一樣,每層的元素的調整深度小於等於h-i,假設每層調整的深度是h-i,欲構建的堆是個完全二叉樹,那麼對於每層來說:
最後一層不用調整;
倒數第二層的消耗是:2^(h-1)*1;
倒數第三層的消耗是:2^(h-2)*2;
。。。。。。
第一層的消耗是:2^(h-h)*(h-1);
加起來總消耗是:s=2^(h-1)*1+2^(h-2)*2+。。。+h;
2s=2^h*1+2^(h-1)*2+。。。+2*h;
s=2^h+2^(h-1)+2^(h-2)+。。。+2^1-h;
s=2^h+2^(h-1)+2^(h-2)+。。。+2^1+2^0-h-1;
s=2^(h+1)-2-h;
h=logn;
代入得:s=2*n-2-logn;
故堆排序的建堆過程是o(n)的。
建堆O n 時間複雜度證明
建堆複雜度先考慮滿二叉樹,計算完全二叉樹建堆複雜度基本相同。對滿二叉樹而言,第i層 根為第0層 有2 i個節點。由於建堆過程自底向上,以交換作為主要操作,因此第i層任意節點在最不利情況下,需要經過 n i 次交換操作才能完成以該節點為堆根節點的建堆過程。因此,時間複雜度計算如下 t n 2 0 n ...
堆排序中 建堆的演算法複雜度分析O n
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 ...
建堆的時間複雜度計算
現在常有兩種建堆的方法,而這兩種方法又有著不同的時間複雜度。下面分別陳述 1 自頂向下的建堆方式 這種建堆的方法具有o n log2n 的時間複雜度。從根結點開始,然後乙個乙個的把結點插入堆中。當把乙個新的結點插入堆中時,需要對結點進行調整,以保證插入結點後的堆依然是大根堆。如下圖所示,是採用自頂向...