亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

Swift實現(xiàn)堆排序算法的代碼示例

2020-03-09 17:48:38
字體:
供稿:網(wǎng)友
堆排序(HeapSort)是一樹形選擇排序,堆排序的時間復雜度O(nlogn),這里我們來看一下Swift實現(xiàn)基堆排序算法的代碼示例,首先對堆排序算法的基本概念作一個了解:
 

算法思想
堆排序利用了最大堆(或小根堆)堆頂記錄的關(guān)鍵字最大(或最小)這一特征,使得在當前無序區(qū)中選取最大(或最?。╆P(guān)鍵字的記錄變得簡單。
1.用最大堆排序的基本思想
(1)先將初始文件R[1..n]建成一個最大堆,此堆為初始的無序區(qū)
(2)再將關(guān)鍵字最大的記錄R[1](即堆頂)和無序區(qū)的最后一個記錄R[n]交換,由此得到新的無序區(qū)R[1..n-1]和有序區(qū)R[n],且滿足R[1..n-1].keys≤R[n].key
(3)由于交換后新的根R[1]可能違反堆性質(zhì),故應將當前無序區(qū)R[1..n-1]調(diào)整為堆。然后再次將R[1..n-1]中關(guān)鍵字最大的記錄R[1]和該區(qū)間的最后一個記錄R[n-1]交換,由此得到新的無序區(qū)R[1..n-2]和有序區(qū)R[n-1..n],且仍滿足關(guān)系R[1..n-2].keys≤R[n-1..n].keys,同樣要將R[1..n-2]調(diào)整為堆。
……
直到無序區(qū)只有一個元素為止。
2.最大堆排序算法的基本操作:
(1)建堆,建堆是不斷調(diào)整堆的過程,從len/2處開始調(diào)整,一直到第一個節(jié)點,此處len是堆中元素的個數(shù)。建堆的過程是線性的過程,從len/2到0處一直調(diào)用調(diào)整堆的過程,相當于o(h1)+o(h2)…+o(hlen/2) 其中h表示節(jié)點的深度,len/2表示節(jié)點的個數(shù),這是一個求和的過程,結(jié)果是線性的O(n)。
(2)調(diào)整堆:調(diào)整堆在構(gòu)建堆的過程中會用到,而且在堆排序過程中也會用到。利用的思想是比較節(jié)點i和它的孩子節(jié)點left(i),right(i),選出三者最大(或者最小)者,如果最大(?。┲挡皇枪?jié)點i而是它的一個孩子節(jié)點,那邊交互節(jié)點i和該節(jié)點,然后再調(diào)用調(diào)整堆過程,這是一個遞歸的過程。調(diào)整堆的過程時間復雜度與堆的深度有關(guān)系,是lgn的操作,因為是沿著深度方向進行調(diào)整的。
(3)堆排序:堆排序是利用上面的兩個過程來進行的。首先是根據(jù)元素構(gòu)建堆。然后將堆的根節(jié)點取出(一般是與最后一個節(jié)點進行交換),將前面len-1個節(jié)點繼續(xù)進行堆調(diào)整的過程,然后再將根節(jié)點取出,這樣一直到所有節(jié)點都取出。堆排序過程的時間復雜度是O(nlgn)。因為建堆的時間復雜度是O(n)(調(diào)用一次);調(diào)整堆的時間復雜度是lgn,調(diào)用了n-1次,所以堆排序的時間復雜度是O(nlgn)[2]
注意
(1)只需做n-1趟排序,選出較大的n-1個關(guān)鍵字即可以使得文件遞增有序。
(2)用小根堆排序與利用最大堆類似,只不過其排序結(jié)果是遞減有序的。堆排序和直接選擇排序相反:在任何時刻堆排序中無序區(qū)總是在有序區(qū)之前,且有序區(qū)是在原向量的尾部由后往前逐步擴大至整個向量為止

Swift示例
(1)基于最大堆實現(xiàn)升序排序

func initHeap(inout a: [Int]) { for var i = (a.count - 1) / 2; i >= 0; --i {  adjustMaxHeap(&a, len: a.count, parentNodeIndex: i) }} func adjustMaxHeap(inout a: [Int], len: Int, parentNodeIndex: Int) { // 如果len <= 0,說明已經(jīng)無序區(qū)已經(jīng)縮小到0 guard len > 1 else {  return }  // 父結(jié)點的左、右孩子的索引 let leftChildIndex = 2 * parentNodeIndex + 1  // 如果連左孩子都沒有, 一定沒有右孩子,說明已經(jīng)不用再往下了 guard leftChildIndex < len else {  return }  let rightChildIndex = 2 * parentNodeIndex + 2  // 用于記錄需要與父結(jié)點交換的孩子的索引 var targetIndex = -1  // 若沒有右孩子,但有左孩子,只能選擇左孩子 if rightChildIndex > len {  targetIndex = leftChildIndex } else {  // 左、右孩子都有,則需要找出最大的一個  targetIndex = a[leftChildIndex] > a[rightChildIndex] ? leftChildIndex : rightChildIndex }  // 只有孩子比父結(jié)點還要大,再需要交換 if a[targetIndex] > a[parentNodeIndex] {  let temp = a[targetIndex]    a[targetIndex] = a[parentNodeIndex]  a[parentNodeIndex] = temp    // 由于交換后,可能會破壞掉新的子樹堆的性質(zhì),因此需要調(diào)整以a[targetIndex]為父結(jié)點的子樹,使之滿足堆的性質(zhì)  adjustMaxHeap(&a, len: len, parentNodeIndex: targetIndex) }} func maxHeapSort(inout a: [Int]) { guard a.count > 1 else {  return }  initHeap(&a)  for var i = a.count - 1; i > 0; --i {  // 每一趟都將堆頂交換到指定范圍內(nèi)的最后一個位置  if a[0] > a[i] {   let temp = a[0]      a[0] = a[i]   a[i] = temp  }  print(a)  print(i - 1)  // 有序區(qū)長度+1,而無序區(qū)長度-1,繼續(xù)縮小無序區(qū),所以i-1  // 堆頂永遠是在0號位置,所以父結(jié)點調(diào)整從堆頂開始就可以了  adjustMaxHeap(&a, len: i - 1, parentNodeIndex: 0)  print(a) }}

 
(2)基于最小堆降序排序

func initHeap(inout a: [Int]) { for var i = (a.count - 1) / 2; i >= 0; --i {  adjustMinHeap(&a, len: a.count, parentNodeIndex: i) }} func adjustMinHeap(inout a: [Int], len: Int, parentNodeIndex: Int) { // 如果len <= 0,說明已經(jīng)無序區(qū)已經(jīng)縮小到0 guard len > 1 else {  return }  // 父結(jié)點的左、右孩子的索引 let leftChildIndex = 2 * parentNodeIndex + 1  // 如果連左孩子都沒有, 一定沒有右孩子,說明已經(jīng)不用再往下了 guard leftChildIndex < len else {  return }  let rightChildIndex = 2 * parentNodeIndex + 2  // 用于記錄需要與父結(jié)點交換的孩子的索引 var targetIndex = -1  // 若沒有右孩子,但有左孩子,只能選擇左孩子 if rightChildIndex > len {  targetIndex = leftChildIndex } else {  // 左、右孩子都有,則需要找出最大的一個  targetIndex = a[leftChildIndex] < a[rightChildIndex] ? leftChildIndex : rightChildIndex }  // 只有孩子比父結(jié)點還要大,再需要交換 if a[targetIndex] < a[parentNodeIndex] {  let temp = a[targetIndex]    a[targetIndex] = a[parentNodeIndex]  a[parentNodeIndex] = temp    // 由于交換后,可能會破壞掉新的子樹堆的性質(zhì),因此需要調(diào)整以a[targetIndex]為父結(jié)點的子樹,使之滿足堆的性質(zhì)  adjustMinHeap(&a, len: len, parentNodeIndex: targetIndex) }} func minHeapSort(inout a: [Int]) { guard a.count > 1 else {  return }  initHeap(&a)  for var i = a.count - 1; i > 0; --i {  // 每一趟都將堆頂交換到指定范圍內(nèi)的最后一個位置  if a[0] < a[i] {   let temp = a[0]      a[0] = a[i]   a[i] = temp  } else {    return // 可以直接退出了,因為已經(jīng)全部有序了  }    // 有序區(qū)長度+1,而無序區(qū)長度-1,繼續(xù)縮小無序區(qū),所以i-1  // 堆頂永遠是在0號位置,所以父結(jié)點調(diào)整從堆頂開始就可以了  adjustMinHeap(&a, len: i - 1, parentNodeIndex: 0) }}

測試:

var arr = [5, 3, 8, 6, 4]//var arr = [89,-7,999,-89,7,0,-888,7,-7]maxHeapSort(&arr) print(arr) // 打印日志如下:[4, 6, 5, 3, 8]3[6, 4, 5, 3, 8] [3, 4, 5, 6, 8]2[5, 4, 3, 6, 8] [3, 4, 5, 6, 8]1[3, 4, 5, 6, 8] [3, 4, 5, 6, 8]0[3, 4, 5, 6, 8] [3, 4, 5, 6, 8]


注:相關(guān)教程知識閱讀請移步到swift教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
99热免费精品在线观看| 欧美一区二区三区四区高清| 日韩簧片在线观看| 国产成人女人毛片视频在线| 国产成人香蕉在线视频网站| 美女激情福利视频在线观看| 欧美激情一区二区三区蜜桃视频| 亚洲天堂av影院| 三级在线观看一区二区| 欧美激情在线一区二区| 国产美女精品在线| 123成人网| 中文视频在线| 蜜臀av免费一区二区三区| 国精产品一区一区三区四川| 图片区小说区区亚洲五月| 午夜精品一区二区在线观看| 亚洲国产美女视频| 理论片影音先锋| 巨乳女教师的诱惑| 久久久国产精品麻豆| 欧美欧美午夜aⅴ在线观看| 亚洲色图视频网站| 性xx无遮挡| 精品国产aaa| 国产精品亚洲综合| 欧美黑人疯狂性受xxxxx喷水| 国产精品久久久久久久久免费樱桃| 性国裸体高清亚洲| 91在线观看欧美日韩| 亚洲国产无码精品| 国产亚洲欧洲高清一区| 大杳蕉精品视频在线观看| 亚洲第一中文字幕在线观看| 国模套图日韩精品一区二区| 日韩精品丝袜在线| 日韩欧美主播在线| 亚洲自拍欧美精品| 青娱乐在线视频免费观看| 日本一级理论片在线大全| 精品国产一区a| 中文字幕一区二区日韩精品绯色| 在线看一区二区| 欧美香蕉爽爽人人爽| 美女一区二区三区在线观看| 日日摸夜夜夜夜夜添| 欧美午夜片在线看| 亚洲国产激情一区二区三区| 欧美黑人巨大videos精品| 国产suv精品一区二区883| 日韩欧美一卡二卡| 超碰97人人人人人蜜桃| 在线观看a视频| 久久视频免费在线| 日本天堂影院在线视频| 成人免费黄色网页| 精品69视频一区二区三区| 日韩成人在线观看视频| 欧美一级淫片免费视频黄| 男操女在线观看| 日韩一区在线免费观看| 伊人网综合视频| 精品国精品国产尤物美女| 欧美一级淫片免费视频魅影视频| 欧美一区二区三区四区在线| 欧美激情第8页| 青草青草久热精品视频在线网站| 欧美日韩专区在线| 91精品国产91久久综合| 国产精品第12页| 国产盗摄——sm在线视频| 白浆视频在线观看| 成人在线免费高清视频| 在线观看黄色av| 欧美性x x x| 亚洲欧美日韩成人在线| 亚洲码在线观看| 国产精品嫩草影视| 欧美日韩精品综合| 久久在线精品视频| 国产精品久久久久久久久粉嫩av| 日韩成人小视频| 亚洲最大成人网色| 日韩视频二区| 日本一区二区久久| 东京热一区二区三区四区| 在线中文字幕一区| 日本高清免费观看| 亚洲午夜精品视频| 亚洲乱码精品久久久久..| 乱一区二区三区在线播放| 国产a√精品区二区三区四区| 一区二区三区国产精华| 欧美区一区二区三区| 欧美成免费一区二区视频| 永久免费av网站| av网站在线播放| 无码人妻精品一区二区三区夜夜嗨| 亚洲欧美在线专区| 热99精品只有里视频最新| 欧美日韩精品久久久免费观看| 91精品国产91久久久久久三级| 亚洲影视在线播放| 欧美日韩高清在线观看| 性xxxx丰满孕妇xxxx另类| 亚洲小说区图片区都市| 91精品国产综合久久久久久久久久| 亚洲视频一区在线播放| 日韩欧美一区在线| 日韩风俗一区 二区| 综合国产在线| 国产精品丝袜久久久久久消防器材| 国产麻豆视频一区| 精品影院一区二区久久久| 999精品在线视频| 国产美女久久精品香蕉69| 精品久久久久久久久久岛国gif| 全黄性性激高免费视频| 欧美日韩国产色| 一区二区三区在线观看www| 国产真人真事毛片| 国产成人亚洲综合91| 亚洲日本成人在线观看| 成人做爰视频网站| 亚洲国产精品自拍视频| 日本理论中文字幕| 超碰成人在线免费| 91色婷婷久久久久合中文| 亚洲精品菠萝久久久久久久| 亚洲第一二三四区| 国产91精品入口17c| 久久久高清一区二区三区| 美洲天堂一区二卡三卡四卡视频| 你懂的视频在线免费| 国产午夜精品视频免费不卡69堂| 日日草天天草| 色综合影院在线观看| 色婷婷精品久久二区二区密| 久久电影网电视剧免费观看| 国产在线观看免费一区| 亚洲精品一二三区区别| 亚洲va久久久噜噜噜久久天堂| 精品97人妻无码中文永久在线| 999色成人| 日韩三级精品电影久久久| 久久一区精品| 国语对白在线视频| 99自拍视频在线观看| 警花av一区二区三区| 亚洲国产黄色| 4444kk在线观看| 久久精品国产亚洲一区二区| 欧美一级夜夜爽| 日韩欧美电影一区二区| 日韩一区二区三区精品| 国产精品久久久久久影视| 成人av一区二区三区| 黑人无套内谢中国美女| 免费日韩av片| 国产av 一区二区三区| 亚洲综合色噜噜狠狠| 久草在线视频精品| 色爱区综合激月婷婷| 大桥未久av一区二区三区| 国产xxxx视频| 亚洲韩国一区二区三区| 久热99视频在线观看| 日本在线一区二区| 亚洲精品乱码久久久久久久久久久久| 夜夜嗨av一区二区三区免费区| 99精品国产一区二区青青牛奶| 国产三级电影在线观看| 美女被c网站| 九色成人免费视频| 国产精品对白久久久久粗| 欧美深夜福利| 黄色一级片网址| 尤物在线免费视频| 亚洲综合专区| 中文字幕有码无码人妻av蜜桃| 国产传媒欧美日韩| 久久黄色网页| 激情内射人妻1区2区3区| 91成人在线精品| 亚洲精品91在线| 欧美精品videos另类日本| 99精品一区二区三区| 久久精品.com| 久久99九九| 日韩精品人妻中文字幕有码| 天堂在线资源8| 欧美做受69| 日韩亚洲欧美成人| 欧美黑吊大战白妞| 国产成人久久精品77777综合| 欧美日韩一区三区| av毛片在线免费看| 欧美激情国产高清| 国产一区视频免费观看| 精品成人免费视频| 黄色av片三级三级三级免费看| 亚洲欧美天堂| 精品电影一区二区三区| 黄色在线免费观看网站| 三级视频网站在线| 18+激情视频在线| 欧美高清电影在线看| 久久久999精品视频| 天堂v在线观看| 亚洲春色综合另类校园电影| 国模一区二区三区白浆| 色播五月综合网| 日本精品一区二区三区四区| 你懂的视频欧美| 伊甸园精品99久久久久久| 国产日韩欧美在线一区| 日韩电影免费观看高清完整版在线观看| 日韩一区二区av| 最近2019免费中文字幕视频三| 亚洲老头同性xxxxx| 超碰99在线| 日韩毛片网站| 欧美黑人又粗又大又爽免费| 波多野结衣三级在线| 韩国视频一区| 中文字幕一区二区三区四区五区六区| 国内一区二区在线视频观看| 国产精品久久久久久久一区二区| 成人在线观看a| 91中文字幕精品永久在线| 三叶草欧洲码在线| 国产视频亚洲视频| 999久久久91| 91国内在线视频| 国产精品作爱| 国产精品av一区二区| 自拍亚洲欧美老师丝袜| 亚洲高清免费观看高清完整版在线观看| 亚洲一区精品视频| 蜜桃网站在线观看| 激情五月综合网| 天天射夜夜骑| 久久九九99| 午夜写真片福利电影网| 欧美日韩大片一区二区三区| 亚洲大胆美女视频| 免费无码毛片一区二区app| 校园春色综合网| 91国偷自产一区二区三区的观看方式| 成人在线手机视频| 色av一区二区三区| 手机看片福利在线| 国产美女精品在线| 一区二区三区在线观看动漫| 第84页国产精品| 久久99精品久久久久久园产越南| 日日摸.com| 国产乱子伦精品无码码专区| 97超碰人人看人人| 国产成人综合精品| 狠狠久久五月精品中文字幕| 欧美精品一区二| 韩国一区二区三区四区| 成人羞羞视频免费看看| 国产欧美综合视频| 波多野结衣视频播放| 在线播放黄色网址| 欧美禁忌电影| 啪啪一区二区三区| 国产在线黄色片| 国产欧美日韩三级| 青青视频一区二区| 波多野结衣在线播放一区| 四虎永久在线观看免费网站网址| 国产麻豆剧果冻传媒视频杜鹃| 性活交片大全免费看| 全免费a级毛片| 欧美成人激情视频| 国产在线98福利播放视频| 乱精品一区字幕二区| 三上悠亚ssⅰn939无码播放| 久久综合图片| 中文字幕av在线播放| 亚洲精品久久嫩草网站秘色| 亚洲欧美日韩一区二区| 五月婷婷六月色| 国产精品第一页第二页第三页| 亚洲一区二区精品3399| 91九色蝌蚪视频| 成人51免费| 久久久久99人妻一区二区三区| 免费看欧美女人艹b| 久久发布国产伦子伦精品| 四虎永久免费地址| 欧美zozo另类异族| 精品人妻中文无码av在线| 一级片视频免费看| 亚洲av无码乱码国产精品| 欧美精品 国产精品| 国产在线播放91| 欧美午夜三级| av在线看片| 日韩av网站导航| 欧美激情精品久久久久久变态| 国产日韩在线不卡| 国产精品久久在线| 国产亚洲精品综合一区91| 最近中文字幕在线mv视频在线| 久久久国产精品午夜一区ai换脸| 欧美一区二区人人喊爽| 成人免费毛片高清视频| 亚洲综合自拍偷拍| 婷婷在线精品视频| 久草综合在线观看| www.成人.com| 四虎永久免费网站| 91国自产精品中文字幕亚洲| 亚洲精品aaaa| 韩国av一区二区三区在线观看| 最好看的2019的中文字幕视频| 欧美一区二区三区视频免费播放| 一区二区三区视频播放| sm捆绑调教视频| 国产成人福利| 91麻豆成人久久精品二区三区| 久久久久午夜电影| а√中文在线天堂精品| 欧美福利在线播放|