日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

堆排序时间复杂度计算

發布時間:2023/12/10 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 堆排序时间复杂度计算 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

堆排序傳入兩個參數arr 以及當前arr截取的需要排序的長度n
首先是進行建堆,第二步將末尾結點替換根結點,對長度截取數n減去1再進行建堆
代碼如下:

function heapify(arr,n,i){//arr數組 n表示當前堆大小也就是arr截取的長度 i表示當前維護的三角堆頂下標let left = i * 2 + 1;let right = i * 2 + 2;let maxindex = i;if(left<n&&arr[maxindex]<arr[left]){maxindex = left;} if(right<n&&arr[maxindex]<arr[right]){maxindex = right;}if(i!=maxindex){let temp = arr[i];arr[i] = arr[maxindex];arr[maxindex] = temp;heapify(arr,n,maxindex);//交換完成后 maxindex所在位置的堆結構被破壞 所以對該堆遞歸} }function heapSort(arr,n){//建堆for(let i=Math.floor(n/2-1);i>=0;i--){//n/2-1也就是找到末尾節點的父節點下標,因為n代表總長度,末尾下標為n-1 對應的父節點下標為(n-1-1)/2heapify(arr,n,i);}//將堆頂和最后一個元素位置交換,并將其拆出來for(let i = n-1;i>=0;i--){let temp = arr[i];arr[i] = arr[0];arr[0] = temp;heapify(arr,i,0);//將最后一個元素排除并建堆} }

時間復雜度計算分析:
建堆時間復雜度(O(n)):
設數組長度為n,層數為h(為了方便理解,h從1計算)
假設是一個滿二叉樹,則3層就有7個節點,4層有11個…所以n = 2^h - 1
從最底部分析,(第一層1個第二層2個第三層4個第h層2^(h-1)個)
倒數第1層節點的父節點最多下調1次,倒數第1層共有2^(h-1)個節點
倒數第2層節點的父節點最多下調2次,倒數第2層共有2^(h-2)個節點

倒數第h-1層(第2層)節點的父節點最多下調h-1次,倒數第h-1層共有2個節點
所以從倒數第一層開始計算

t = 1 * 2^(h-1) + 2 * 2^(h-2) + 3 * 2^(h-3)…+ (h-1) * 2^1

由公式可看出,下調次數就是當前節點所在層數能夠下探的層數。
假設4層的滿二叉樹,則對于第3層,還有1層下探空間,所以才說第4層的父節點(第3層)最多下調1次
所以第2層的父節點(根節點)最多下調h-1次
每層的計算為:最大下調次數 * 當前層節點個數
總結下來每層(從第2層開始算)的計算公式(假設當前第i層(i從1計算),總層數h)為 (h-i) * 2^(i-1)
現在需要t和h的關系
通過高中數學計算2t-t = 2^1 + 2^2 + 2^3 + … + 2^(i-1) + (h-i)*2^i - (h-1) * 2 = 2^i -2i
又因為總節點數n = 2^i - 1 所以i = log(n+1)
所以t = 2^log(n+1) - 2log(n+1) 忽略掉后者,t = n + 1
所以建堆時間復雜度O(n)

交換尾結點與根節點時間復雜度(O(nlogn))
和建堆的思路差不多,交換節點為O(1)交換n次,所以遍歷消耗時間O(n),最壞情況下,對n-1個節點建堆的過程中,耗時為O(logn),所以耗時為n*log(n)

因此總耗時為O(n) + O(nlogn),考慮n>=2時,logn比1大,所以最終取時間復雜度為O(nlogn)

上述進行的計算在思路上參考了眾多其他文章,思路上大同小異,若有誤希望大家指出。

總結

以上是生活随笔為你收集整理的堆排序时间复杂度计算的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。