堆排序的時間複雜度分析

2021-08-19 03:16:26 字數 2127 閱讀 6184

堆排序包括兩個階段,初始化建堆和重建堆。所以堆排序的時間複雜度由這兩方面組成,下面分別進行分析。先post乙個實現**,便於分析。

#include 

void swap(int *a, int *b);

void adjustheap(int param1,int j, int innums);

void heapsort(int nums, int innums);

//大根堆進行調整

void adjustheap(int param1, int j, int innums)

//如果子節點大於父節點,將子節點值賦給父節點,並以新的子節點作為父節點(不用進行交換)

if (innums[k]>temp)

else

break;

}//put the value in the final position

innums[param1]=temp;

}//堆排序主要演算法

void heapsort(int nums,int innums)

//2.調整堆結構+交換堆頂元素與末尾元素

for (int j=nums-1;j>0;j--)

}int main() ;

int len = sizeof(data) / sizeof(int);

heapsort(len,data);

return

0;}

初始化建堆只需要對二叉樹的非葉子節點呼叫adjusthead()函式,由下至上,由右至左選取非葉子節點來呼叫adjusthead()函式。那麼倒數第二層的最右邊的非葉子節點就是最後乙個非葉子結點。

假設高度為k,則從倒數第二層右邊的節點開始,這一層的節點都要執行子節點比較然後交換(如果順序是對的就不用交換);倒數第三層呢,則會選擇其子節點進行比較和交換,如果沒交換就可以不用再執行下去了。如果交換了,那麼又要選擇一支子樹進行比較和交換;高層也是這樣逐漸遞迴。

那麼總的時間計算為:s = 2^( i - 1 ) * ( k - i );其中 i 表示第幾層,2^( i - 1) 表示該層上有多少個元素,( k - i) 表示子樹上要下調比較的次數。

s = 2^(k-2) * 1 + 2^(k-3)2…..+2(k-2)+2^(0)*(k-1) ===> 因為葉子層不用交換,所以i從 k-1 開始到 1;

s = 2^k -k -1;又因為k為完全二叉樹的深度,而log(n) =k,把此式帶入;

得到:s = n - log(n) -1,所以時間複雜度為:o(n)

在取出堆頂點放到對應位置並把原堆的最後乙個節點填充到堆頂點之後,需要對堆進行重建,只需要對堆的頂點呼叫adjustheap()函式。

每次重建意味著有乙個節點出堆,所以需要將堆的容量減一。adjustheap()函式的時間複雜度k=log(n),k為堆的層數。所以在每次重建時,隨著堆的容量的減小,層數會下降,函式時間複雜度會變化。重建堆一共需要n-1次迴圈,每次迴圈的比較次數為log(i),則相加為:log2+log3+…+log(n-1)+log(n)≈log(n!)。可以證明log(n!)和nlog(n)是同階函式: ∵(

n/2)

n/2≤

n!≤n

n,∵ (n

/2)n

/2≤n

!≤nn

,∴n/

4log(n

)=n/

2log(n

1/2)

≤n/2

log(n/

2)≤log(n

!)≤n

log(n)

∴ n/

4log⁡(

n)=n

/2

log⁡(n

1/2)

≤n/2

log⁡(n

/2)≤

log⁡(n

!)≤n

log⁡(n

)所以時間複雜度為o(nlogn)

初始化建堆的時間複雜度為o(n),排序重建堆的時間複雜度為nlog(n),所以總的時間複雜度為o(n+nlogn)=o(nlogn)。另外堆排序的比較次數和序列的初始狀態有關,但只是在序列初始狀態為堆的情況下比較次數顯著減少,在序列有序或逆序的情況下比較次數不會發生明顯變化。

堆排序的時間複雜度分析

堆排序包括兩個階段,初始化建堆和重建堆。所以堆排序的時間複雜度由這兩方面組成,下面分別進行分析。先post乙個實現 便於分析。include void swap int a,int b void adjustheap int param1,int j,int innums void heapsort...

堆排序時間複雜度 堆排序

科班出身的程式設計師就應該研究些演算法和資料結構類的東西,不然,有什麼優勢?堆排序,結構是完全二叉樹,選擇排序的一種,其流程控制和氣泡排序類似,每次選出乙個最大 或最小的元素 排出去,然後下一輪再選出乙個最大 最小的 以此類推,直到剩下乙個不能構成二叉樹為止也排出去,排出來的就是有序的了。只不過每次...

堆排序時間複雜度 堆排序演算法

堆排序是指利用堆積樹這種資料結構所設計的一種排序演算法,它是選擇排序的一種。可以利用陣列的特點快速定位指定索引的元素。堆是乙個優先順序佇列,對於大頂堆而言,堆頂元素的權值最大。將待排序的數組建堆,然後不斷地刪除堆頂元素,就實現了排序。堆排序基本思想 將待排序序列構造成乙個大頂堆,此時,整個序列的最大...