最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

理解二叉堆數(shù)據(jù)結(jié)構(gòu)及Swift的堆排序算法實現(xiàn)示例

 更新時間:2016年07月06日 12:03:17   作者:yoyo  
二插堆即是完全二叉樹,對于排序可以按構(gòu)建最大堆或最小堆的方式來實現(xiàn),這里我們就來共同理解二叉堆數(shù)據(jù)結(jié)構(gòu)及Swift的堆排序算法實現(xiàn)示例

二叉堆的性質(zhì)
1.二叉堆是一顆完全二叉樹,最后一層的葉子從左到右排列,其它的每一層都是滿的
2.最小堆父結(jié)點小于等于其每一個子結(jié)點的鍵值,最大堆則相反
3.每個結(jié)點的左子樹或者右子樹都是一個二叉堆
下面是一個最小堆:

201676115656190.png (186×112)

堆的存儲
通常堆是通過一維數(shù)組來實現(xiàn)的。在起始數(shù)組為 0 的情形中:
1.父節(jié)點i的左子節(jié)點在位置 (2*i+1);
2.父節(jié)點i的右子節(jié)點在位置 (2*i+2);
3.子節(jié)點i的父節(jié)點在位置 floor((i-1)/2);

201676115727165.jpg (410×166)

維持堆的性質(zhì)
我們以最大堆來介紹(后續(xù)會分別給出最大堆和最小堆的實現(xiàn)).所謂維持堆得性質(zhì)就是字面意思,也就是確保葉子節(jié)點和父節(jié)點的關(guān)系是堆得關(guān)系; 那么怎么維持呢?

這里我們是以某一個節(jié)點為起始點,調(diào)整其自身與子節(jié)點的關(guān)系,使得父節(jié)點總是大于子節(jié)點,處理完畢后遞歸操作調(diào)整后的節(jié)點;
我們來看一下具體的實現(xiàn):

/**
* 維護最大堆的性質(zhì)
*/
func heapify(inout A:[Int], i:Int, size:Int) {
 var l = 2 * i
 var r = l + 1
  var largest = i

 if l < size && A[l] > A[i] {
 largest = l
 }
  if r < size && A[r] > A[largest] {
    largest = r
  }
  if largest != i {
    swap(&A, i, largest)
    heapify(&A, largest, size)
  }  
}

有效代碼也就10行上下, 簡單解釋下,根據(jù)傳入的節(jié)點在數(shù)組內(nèi)的索引,計算出左右子節(jié)點,然后比較比較子節(jié)點的值大小,將大的值對調(diào)為父節(jié)點的值,最后遞歸處理新節(jié)點;

構(gòu)建堆
現(xiàn)在來看第二步,也就是構(gòu)建一個堆。我們的輸入數(shù)據(jù)源是一個以為數(shù)組,需要通過構(gòu)建,將其以堆的性質(zhì)加以調(diào)整; 我們來看一下具體的實現(xiàn):

/**
* 構(gòu)建最大堆
*/
func buildHeap(inout A:[Int]) {
  for var i = A.count/2; i >= 0; i-- {
    heapify(&A, i, A.count)
  }
  println("build heap:\(A)")
}

簡單解釋下,根據(jù)上一步已經(jīng)得到的維護堆性質(zhì)的函數(shù),我們隊數(shù)組內(nèi)的所有非葉子節(jié)點遍歷,針對每個節(jié)點都做一遍堆處理,最后得到的就是一個完整的堆; 可能不理解的騷年會問了,為什么數(shù)組遍歷不是全量的,而是[A.count/2, 0]?
這個問題,我想最好的的答案是你畫一個二叉樹,一眼就能明白,這棵樹中非葉子節(jié)點的索引就是count/2;

堆排序

現(xiàn)在重溫一下,這個經(jīng)典的堆排序是怎么實現(xiàn)的。
以算法導(dǎo)論中對堆排序的介紹,可以簡單的歸結(jié)為三句話:
1.維持堆的性質(zhì)
2.構(gòu)建堆
3.堆排序
好,終于到了見證奇跡的時刻,我們把數(shù)組排個序輸出一下。

/**
*堆排序
*/
func heapSort(inout A:[Int]) {
  buildHeap(&A)
  var size = A.count
  for var i = A.count - 1; i >= 1; i-- {
    swap(&A, i, 0)
    size--
    heapify(&A, 0, size)
  }
  println("sorted heap:\(A)")
}

這里呢,需要注意的地方就是每次得到最大值后,我們需要把問題的解規(guī)模減小,因為我們是原址排序,實際上是把一維數(shù)組分為了未排序的堆和已排序的數(shù)組兩部分,已排序的部分放在數(shù)組尾部;

驗證一下
隨便搞個數(shù)組,我們排個隊

var A = [4, 1, 3, 2, 16, 9,9, 10, 14, 8, 7]
heapSort(&A)
avens-MacBook-Pro:aven$ ./max-heap-sort.swift 
build heap:[16, 14, 9, 10, 8, 7, 9, 2, 3, 1, 4]
sorted heap:[1, 2, 3, 4, 7, 8, 9, 9, 10, 14, 16]

小結(jié)
上面我們已經(jīng)完成了最大堆的算法的編碼,最小堆也是類似的; 算法這東西如果能理解的話寫起來就不太難,所以一定要對理論有所了解,真正理解了算法思路才能吧思路寫成代碼。

相關(guān)文章

  • Swift 3.1聊天界面鍵盤效果的實現(xiàn)詳解

    Swift 3.1聊天界面鍵盤效果的實現(xiàn)詳解

    這篇文章主要給大家介紹了Swift 3.1聊天界面鍵盤效果實現(xiàn)的相關(guān)資料,文中介紹的非常詳細(xì),相信對大家的學(xué)習(xí)或者工作具有一定的參考價值,需要的朋友們下面來一起看看吧。
    2017-04-04
  • Swift教程之方法詳解

    Swift教程之方法詳解

    這篇文章主要介紹了Swift教程之方法詳解,方法是關(guān)聯(lián)到一個特定類型的函數(shù),類、結(jié)構(gòu)、枚舉所有可以定義實例方法,封裝特定任務(wù)和功能處理給定類型的一個實例,需要的朋友可以參考下
    2015-01-01
  • 詳解Swift中enum枚舉類型的用法

    詳解Swift中enum枚舉類型的用法

    Swift中通過enum關(guān)鍵字可以直接創(chuàng)建出枚舉對象,而且可以使用switch和case語句來進行流程控制,十分強大和靈活,這里我們就來詳解Swift中enum枚舉類型的用法
    2016-06-06
  • swift中正確安全聲明一個單例的方法實例

    swift中正確安全聲明一個單例的方法實例

    這篇文章主要給大家介紹了關(guān)于swift中如何正確安全聲明一個單例的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • swift4.2實現(xiàn)新聞首頁導(dǎo)航

    swift4.2實現(xiàn)新聞首頁導(dǎo)航

    這篇文章主要為大家詳細(xì)介紹了swift4.2實現(xiàn)新聞首頁導(dǎo)航,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • Swift下使用UICollectionView 實現(xiàn)長按拖拽功能

    Swift下使用UICollectionView 實現(xiàn)長按拖拽功能

    拖拽排序是新聞類的App可以說是必有的交互設(shè)計,如今日頭條,網(wǎng)易新聞等。這篇文章主要介紹了Swift下使用UICollectionView 長按拖拽功能,需要的朋友可以參考下
    2017-03-03
  • 深入探究Swift枚舉關(guān)聯(lián)值的內(nèi)存

    深入探究Swift枚舉關(guān)聯(lián)值的內(nèi)存

    這篇文章主要給大家介紹了關(guān)于Swift枚舉關(guān)聯(lián)值的內(nèi)存的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用Swift具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Swift操作Quartz 2D進行簡單的繪圖與坐標(biāo)變換的教程

    Swift操作Quartz 2D進行簡單的繪圖與坐標(biāo)變換的教程

    這篇文章主要介紹了Swift操作Quartz 2D進行簡單的繪圖與坐標(biāo)變換的教程,Quartz 2D是Core Graphics框架中的一個重要組件,經(jīng)常被Mac OS或和iOS開發(fā)者用來繪圖,需要的朋友可以參考下
    2016-04-04
  • 零基礎(chǔ)上手Swift快速入門教程概覽

    零基礎(chǔ)上手Swift快速入門教程概覽

    這篇文章主要介紹了零基礎(chǔ)上手Swift快速入門教程概覽,Swift是由蘋果開發(fā)的新編程語言并且即將開源,需要的朋友可以參考下
    2015-11-11
  • SwiftUI中@ViewBuilder的相關(guān)知識點解密

    SwiftUI中@ViewBuilder的相關(guān)知識點解密

    IOS開發(fā)目前最主流的框架當(dāng)屬SwiftUI了,這篇文章主要給大家介紹了關(guān)于SwiftUI中@ViewBuilder的一些相關(guān)知識點,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-07-07

最新評論

苏尼特右旗| 昭苏县| 四会市| 吴江市| 江川县| 郎溪县| 久治县| 汾阳市| 富阳市| 紫金县| 琼海市| 古蔺县| 攀枝花市| 车致| 江都市| 密山市| 原平市| 南乐县| 仙桃市| 万年县| 沙坪坝区| 岐山县| 固安县| 佳木斯市| 清河县| 朔州市| 会宁县| 大同市| 游戏| 吉木萨尔县| 定南县| 五河县| 徐州市| 高清| 驻马店市| 寿宁县| 福鼎市| 白水县| 山东省| 高陵县| 德化县|