1. 程式人生 > >關於堆排序建堆時間複雜度的證明

關於堆排序建堆時間複雜度的證明

建堆的過程,看起來外面一層迴圈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)的。