堆排序时间复杂度的计算过程
一、代碼實現
關于具體實現過程請點 https://blog.csdn.net/weixin_44324174/article/details/104183349
本片文章只講堆排序時間復雜度的計算過程。
二、時間復雜度的計算
注意:這里計算都是以完滿二叉樹進行計算的。
1、建堆
建堆的過程都是從倒數第二層最右邊的節點開始,每個節點調整位置花費的時間復雜度是O(1),為了方便后面的計算,統計就說是執行1次;然后是倒數第三層,這一層每個節點也需要執行1次,但是因為調整后會影響到它的后面的節點,所以每個節點還需執行1次(這個次數取決于你的代碼怎么寫,非常關鍵),這里非常關鍵。
int max=root; if(leftcode<length&&arr[leftcode]>=arr[max]){max=leftcode; }if(rightcode<length&&arr[rightcode]>=arr[max]){max=rightcode; } if (max!=root) {swap(arr,max,root)//調整完之后,可能會影響到下面的子樹,需再次調整BuildHeap(arr,length,max); }上面的代碼是調整節點位置的過程,我們發現,這種代碼調整之后的結果是:**父節點最后只和它的左孩子節點或右孩子節點的其中一個發生了交換,**所以倒數第三層每個節點的在調整位置的時候,每個節點只會影響到它的右子樹或者左子樹的結構中的一個,所以執行1次。如果這里的代碼采用的是父節點先和左孩子結點比較交換然后再和右孩子節點比較交換的寫法,那它最后時間復雜度計算出來的結果就是nlogn;我們是以最優的算法來計算的。
我們以三層結構的完滿二叉樹舉例來推導一下計算公式
所以最后推導出來的公式就是:
所以建堆的總執行次數就是:S=2^(k+1)-k-2
完滿二叉樹的節點個數是2的整次冪減1,所以2^k-1=節點個數n,所以高度k=log(n+1);
把k帶入S中可得:S=2^(log(n+1)+1)-log(n+1)-2,化簡得S=2n-log(n+1);
所以建堆的時間復雜度為O(n);
2、取值后重新調整堆
取值每次取的都是堆頂元素,取完重新調整的次數都是k次,時間復雜度就是也就是logn,而循環要執行n次,所以取值后重新調整堆得時間復雜度就是O(nlogn);
綜上所述,堆排序的時間復雜度就是O(n(logn+1))就是O(nlogn);
完全都是個人理解,網上搜了好多,自己都沒看的太懂,后來自己摸索著搞了搞,哪里有問題還請指正。
總結
以上是生活随笔為你收集整理的堆排序时间复杂度的计算过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 掌握jquery,完全掌握jqu
- 下一篇: 专业pdf转word转换软件 pdf转换