一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術(shù)及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Swift - 理解二叉堆數(shù)據(jù)結(jié)構(gòu)及Swift的堆排序算法實現(xiàn)示例

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

2020-12-28 11:29yoyo Swift

二插堆即是完全二叉樹,對于排序可以按構(gòu)建最大堆或最小堆的方式來實現(xiàn),這里我們就來共同理解二叉堆數(shù)據(jù)結(jié)構(gòu)及Swift的堆排序算法實現(xiàn)示例

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

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

堆的存儲
通常堆是通過一維數(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);

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

 

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* 維護最大堆的性質(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):

?
1
2
3
4
5
6
7
8
9
/**
* 構(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)的。
以算法導論中對堆排序的介紹,可以簡單的歸結(jié)為三句話:
1.維持堆的性質(zhì)
2.構(gòu)建堆
3.堆排序
好,終于到了見證奇跡的時刻,我們把數(shù)組排個序輸出一下。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
/**
*堆排序
*/
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ù)組,我們排個隊

?
1
2
3
4
5
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)完成了最大堆的算法的編碼,最小堆也是類似的; 算法這東西如果能理解的話寫起來就不太難,所以一定要對理論有所了解,真正理解了算法思路才能吧思路寫成代碼。

延伸 · 閱讀

精彩推薦
  • SwiftSwift教程之基礎(chǔ)數(shù)據(jù)類型詳解

    Swift教程之基礎(chǔ)數(shù)據(jù)類型詳解

    這篇文章主要介紹了Swift教程之基礎(chǔ)數(shù)據(jù)類型詳解,本文詳細講解了Swift中的基本數(shù)據(jù)類型和基本語法,例如常量和變量、注釋、分號、整數(shù)、數(shù)值類型轉(zhuǎn)換等...

    Swift教程網(wǎng)5162020-12-18
  • SwiftSwift中轉(zhuǎn)義閉包示例詳解

    Swift中轉(zhuǎn)義閉包示例詳解

    在Swift 中的閉包類似于結(jié)構(gòu)塊,并可以在任何地方調(diào)用,下面這篇文章主要給大家介紹了關(guān)于Swift中轉(zhuǎn)義閉包的相關(guān)資料,需要的朋友可以參考下...

    小小小_小朋友11412021-12-26
  • SwiftSwift能代替Objective-C嗎?

    Swift能代替Objective-C嗎?

    這是我在網(wǎng)上上看到的答案,復制粘貼過來和大家分享一下,因為我和很多人一樣很關(guān)心Swift的出現(xiàn)對Mac開發(fā)的影響和對Objective-C的影響。...

    Swift教程網(wǎng)4412020-12-16
  • Swiftswift where與匹配模式的實例詳解

    swift where與匹配模式的實例詳解

    這篇文章主要介紹了swift where與匹配模式的實例詳解的相關(guān)資料,這里附有簡單的示例代碼,講的比較清楚,需要的朋友可以參考下...

    追到夢的魔術(shù)師14382021-01-06
  • SwiftSwift實現(xiàn)多個TableView側(cè)滑與切換效果

    Swift實現(xiàn)多個TableView側(cè)滑與切換效果

    這篇文章主要為大家詳細介紹了Swift實現(xiàn)多個TableView側(cè)滑與切換效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    乞力馬扎羅的雪雪5822021-01-08
  • Swiftmac git xcrun error active developer path 錯誤

    mac git xcrun error active developer path 錯誤

    本文主要是講訴了如何解決在mac下使用git;xcode4.6的環(huán)境時,出現(xiàn)了錯誤(mac git xcrun error active developer path)的解決辦法,希望對大家有所幫助...

    Swift教程網(wǎng)2232020-12-16
  • SwiftSwift的74個常用內(nèi)置函數(shù)介紹

    Swift的74個常用內(nèi)置函數(shù)介紹

    這篇文章主要介紹了Swift的74個常用內(nèi)置函數(shù)介紹,這篇文章列舉出了所有的Swift庫函數(shù),內(nèi)置函數(shù)是指無需引入任何模塊即可以直接使用的函數(shù),需要的朋友可...

    Swift教程網(wǎng)5802020-12-19
  • SwiftSwift使用CollectionView實現(xiàn)廣告欄滑動效果

    Swift使用CollectionView實現(xiàn)廣告欄滑動效果

    這篇文章主要為大家詳細介紹了Swift使用CollectionView實現(xiàn)廣告欄滑動效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Stevin的技術(shù)博客12372021-01-13
主站蜘蛛池模板: 日本在线观看www鲁啊鲁视频 | 欧美国产在线视频 | 兽操人 | 色综合伊人色综合网亚洲欧洲 | 近亲乱中文字幕 | 非洲黑人gay巨大 | 精品视频一区在线观看 | 日本一区二区三区在线 观看网站 | 亚洲四虎影院 | 精品久久香蕉国产线看观看麻豆 | 亚洲va在线va天堂成人 | 成人免费观看网欧美片 | 男人都懂www深夜免费网站 | 99久久精品免费看国产 | 亚洲 在线 日韩 欧美 | xnxx18美女 | 2021福利视频 | 青青91 | 日韩精品一区二区三区毛片 | 青青视频国产依人在线 | 亚洲女同一区二区 | 欧美性xxx狂流白浆 欧美性f | 91香蕉国产视频 | 香蕉久久一区二区三区 | 日韩精品1 | 好猛好紧好硬使劲好大刺激视频 | 动漫a级片 | 国产全部视频 | 亚州免费一级毛片 | 全肉np巨肉一女np高h双龙 | 99在线观看免费视频 | 亚洲 综合 自拍 精品 在线 | 视频一本大道香蕉久在线播放 | 范冰冰a级一级特级毛片 | 狠狠色综合久久婷婷色天使 | 亚洲+欧美+国产+综合 | 波多野结衣女教师在线观看 | 91视频a | 美女在尿口隐私视频 | 久久国产乱子伦精品免费不卡 | 久久精品国产久精国产果冻传媒 |