堆排序時間複雜度的理解

2021-06-12 06:31:23 字數 1365 閱讀 8858

堆排序

這裡不再贅述堆的定義 和堆排序的講解,詳見海子的部落格

,裡面圖示已經很清楚了,這裡首先對該部落格對我的啟發表示感謝。

難點:1. 對堆的理解:

從堆的定義可以看出,堆有兩個性質:i. 完全二叉樹(即按二叉樹逐層從左到右排列資料,這樣便於所以某個節點的父節點或者子節點);ii. 大頂堆(或小頂堆)(即任何父節點大於(或者小於)左子節點和右子節點中的最大值(或最小值))

另外,對於所有元素中根節點最大的堆稱為最大堆或者大根堆(同理也有最小堆或者小根堆)。

2. 構造最大堆:從最後乙個非葉子節點開始把每一對二叉樹元素(乙個父節點和其子節點)進行構造堆操作(即如果左子節點和有子節點中的最大值比父節點更大,就與父節點交換以保證父節點最大,並且對以該子節點為根的二叉樹元素繼續遞迴上述操作以保證交換後的二叉樹仍然是堆(即滿足第二個條件)),一直往前進行到頂層的二叉樹元素為止。  最終得到的堆即為最大堆。   以上操作複雜度為o(n),大概需進行n/2 * 2 = n次比較和n/2次交換。

關於最大堆,有乙個性質:即任意改變最大堆的根節點(這裡主要是減小根節點的值,不然幾乎不用操作)後對最大堆的根節點進行一次構造堆操作,得到的堆仍然是最大堆。這裡我沒有給出證明,但可以理解的是,由於上述構造堆操作是遞迴進行的,因此,較大的數(或者說第二大的數)絕不會藏在堆的下方,在遞迴操作下肯定會往上頂。     後來想想似乎不用證明,因為第二大數肯定是根節點的子節點,進行一次交換即可保證堆是最大堆。

上述構造堆操作的演算法複雜度是o(log2(n))的理解:  假設該操作的時間是t(n),則最大的t(n) = t(2/3 n) + o(1),這裡的o(1)指的是根節點及其左右子節點的操作,它肯定是有限的(最多兩次比較一次交換),如果有交換需要對以某個子節點為根的堆重複上述操作,由於堆是完全二叉樹,因此該新堆的數量不會超過2/3 n,所以得到了上式。     在《演算法導論》的4.1節有乙個主定理的證明,即當滿足t(n) = at(n/b) + f(n)  滿足一定條件時,可得t(n)的時間複雜度為o(log2(n))    (其實書中說是log n,我的理解就是log2(n))

3.  有了以上基礎,就很好理解堆排序的時間複雜度了。

堆排序演算法為:構造最大堆,從而得到最大的元素,將最大的元素與最後乙個元素交換(即取出最大的元素),然後對根節點為首的除最後乙個元素之外的n-1個元素進行一次構造堆操作,由之前討論了的性質可以知道,該一次操作後得到的堆仍為最大堆,故可以繼續將根節點與第n-1個節點交換,取出第二大元素……重複上述操作直到依次取出第n-1大元素即完成了排序。

時間複雜度為 t(n) <=  o(n)  + (n - 1)*o(log2(n)),即等於第一次構造最大堆操作 加上  後面n-1次構造堆操作   其實由於n的減小,後面的o(log2(n))中的n也會減小,所以這裡用小於等於號 。最後得到的t(n) =o(nlog2(n)).

堆排序時間複雜度 堆排序

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

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

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

堆排序時間複雜度 基於PHP實現堆排序原理

每日17點準時技術乾貨分享 堆 堆 heap 是電腦科學中一類特殊的資料結構的統稱,通常是乙個可以被看做一棵樹的陣列物件。堆 ki k2i,ki k2i 1 ki k2i,ki k2i 1 i 1,2,3,4.n 2 關於堆 完全二叉樹 說到堆排序,就不能不提完全二叉樹,這些基本概念在網上到處都是,...