堆排序中建堆過程的時間複雜度O n 的證明

2021-08-27 10:36:37 字數 512 閱讀 3313

下面是建立大根堆的**

template void createbigrootheap(type *array, int len)

array[k] = temp;}}

現在對建立堆時所使用的時間複雜度為o(n)進行證明:

令堆所對應的完全二叉樹的高度為h,節點的個數為n,現假定完全二叉樹為滿二叉樹:即n = 2^h - 1,如下圖(借用網上的圖)所示

有2^(h-2)個結點向下訪問一次,2^(h-3)個結點向下訪問2次,...1個結點向下訪問h次:

推導公式如下:

在堆所對應的二叉樹為非滿二叉樹時,複雜度是n同階的。

apr 16, 2013 @lab

堆排序建堆的時間複雜度

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