Swift-堆排序

堆實際上是一棵完全二叉樹,其任何一非葉節(jié)點滿足性質(zhì):
Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者Key[i]>=Key[2i+1]&&key>=key[2i+2]
即任何一非葉節(jié)點的關(guān)鍵字不大于或者不小于其左右孩子節(jié)點的關(guān)鍵字。

堆分為大頂堆和小頂堆,滿足Key[i]>=Key[2i+1]&&key>=key[2i+2]稱為大頂堆荠雕,滿足 Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]稱為小頂堆婶博。由上述性質(zhì)可知大頂堆的堆頂?shù)年P(guān)鍵字肯定是所有關(guān)鍵字中最大的,小頂堆的堆頂?shù)年P(guān)鍵字是所有關(guān)鍵字中最小的.

小頂堆

核心代碼:

    func heapSort(arr:inout [Int]) {
        
        buildMinHeap(arr: &arr) //建立堆驹闰,無序
        
        for i in (1..<arr.count).reversed() {
            swap(&arr[i], &arr[0]) // 第一個元素和第i個元素交換
            minHeap(arr: &arr, count: i, index: 0) // 第一個元素不斷的調(diào)整位置
        }
        
    }
    
    
    func buildMinHeap(arr:inout [Int]) {
        
        let count:Int = arr.count
        let index:Int = count/2 - 1
        for i in (0...index).reversed() {
            minHeap(arr: &arr, count: count-1, index: i)
        }
    }
    
    func minHeap(arr:inout [Int],count:Int,index:Int) {
        var parent:Int = index
        var child:Int = 2*parent + 1 // 獲取左子樹節(jié)點
        while  child < count {
            let right:Int = child + 1
            // 如果右節(jié)點大于左節(jié)點定硝,則選擇右孩子節(jié)點
            if right < count && arr[child] < arr[right] {
                child += 1
            }
            
            // 如果父節(jié)點大于左右節(jié)點中的大值返回
            if arr[parent] > arr[child] {
                break;
            }
            
            if index != child {
                swap(&arr[parent], &arr[child]) // 父節(jié)點下沉
            }
            parent = child // 選擇孩子節(jié)點作為根節(jié)點
            child = child + 1
        }
        
    }

大頂堆

核心代碼:

    func heapMaxSort(arr:inout [Int]) {
        
        buildMaxHeap(arr: &arr) //建立最大堆皿桑,無序
        
        for i in (1..<arr.count).reversed() {
            swap(&arr[i], &arr[0]) // 第一個元素和第i個元素交換
            maxHeap(arr: &arr, count: i, index: 0) // 第一個元素不斷的調(diào)整位置
        }
        
    }
    
    
    func buildMaxHeap(arr:inout [Int]) {
        
        let count:Int = arr.count
        let index:Int = count/2 - 1
        for i in (0...index).reversed() {
            maxHeap(arr: &arr, count: count-1, index: i)
        }
    }
    
    func maxHeap(arr:inout [Int],count:Int,index:Int) {
        var parent:Int = index
        var child:Int = 2*parent + 1 // 獲取左子樹節(jié)點
        while  child < count {
            let right:Int = child + 1
            // 如果右節(jié)點小于左節(jié)點,則選擇右孩子節(jié)點
            if right < count && arr[child] > arr[right] {
                child += 1
            }
            
            // 如果父節(jié)點小于左右節(jié)點中的大值返回
            if arr[parent] < arr[child] {
                break;
            }
            
            if index != child {
                swap(&arr[parent], &arr[child]) // 父節(jié)點下沉
            }
            parent = child // 選擇孩子節(jié)點作為根節(jié)點
            child = child + 1
        }
        
    }

測試代碼:

        var minHeapData:[Int] = [16,7,3,20,17,8]
        let heapSort:HeapSort = HeapSort()
        
        heapSort.heapSort(arr: &minHeapData)
        
        print("FlyElephant--小根堆結(jié)果---\(minHeapData)")
        
        var maxHeapData:[Int] = [16,7,3,20,17,8]
        heapSort.heapMaxSort(arr: &maxHeapData)
        print("FlyElephant--大根堆結(jié)果---\(maxHeapData)")
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市诲侮,隨后出現(xiàn)的幾起案子镀虐,更是在濱河造成了極大的恐慌,老刑警劉巖浆西,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粉私,死亡現(xiàn)場離奇詭異顽腾,居然都是意外死亡近零,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門抄肖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來久信,“玉大人,你說我怎么就攤上這事漓摩∪故浚” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵管毙,是天一觀的道長腿椎。 經(jīng)常有香客問我,道長夭咬,這世上最難降的妖魔是什么啃炸? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮卓舵,結(jié)果婚禮上南用,老公的妹妹穿的比我還像新娘。我一直安慰自己掏湾,他們只是感情好裹虫,可當(dāng)我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著融击,像睡著了一般筑公。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上尊浪,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天十酣,我揣著相機與錄音,去河邊找鬼际长。 笑死耸采,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的工育。 我是一名探鬼主播虾宇,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼如绸!你這毒婦竟也來了嘱朽?” 一聲冷哼從身側(cè)響起旭贬,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎搪泳,沒想到半個月后稀轨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡岸军,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年奋刽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片艰赞。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡佣谐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出方妖,到底是詐尸還是另有隱情狭魂,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布党觅,位于F島的核電站雌澄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏杯瞻。R本人自食惡果不足惜镐牺,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望又兵。 院中可真熱鬧任柜,春花似錦、人聲如沸沛厨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逆皮。三九已至宅粥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間电谣,已是汗流浹背秽梅。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留剿牺,地道東北人企垦。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像晒来,于是被迫代替她去往敵國和親钞诡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1.堆 堆實際上是一棵完全二叉樹,其任何一非葉節(jié)點滿足性質(zhì): Key[i]<=key[2i+1]&&Key[i]<...
    HeartGo閱讀 281評論 0 1
  • 不久前陪一個博士畢業(yè)的醫(yī)師朋友送他還沒滿五周歲的小孩去瀏城橋定王大廈的一個少兒英語培訓(xùn)機構(gòu)參加培訓(xùn)荧降,里面窗戶密閉接箫,...
    幸運的豬頭閱讀 718評論 4 5
  • 狐貍本來是西王母座下四大神獸之一,蘇妲己被女媧處置之后朵诫。也有不少小妖被貶下凡間辛友,其中就有一個小妖精,名叫...
    蘿卜luobo閱讀 228評論 0 0
  • DPL預(yù)選賽剪返,比賽結(jié)果1:1 兩局共同點:顯然WINGS已經(jīng)會針對VG了废累,BAN VS和先知,搶獸王随夸【拍基本就GG震放。...
    春愿君閱讀 126評論 0 0