亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

用python實現(xiàn)堆排序

系統(tǒng) 1980 0

用python實現(xiàn)堆排序

一、概念

堆排序,顧名思義,就是基于堆。因此先來介紹一下堆的概念。?
堆分為最大堆和最小堆,其實就是完全二叉樹。最大堆要求節(jié)點的元素都要大于其孩子,最小堆要求節(jié)點元素都小于其左右孩子,兩者對左右孩子的大小關系不做任何要求,其實很好理解。有了上面的定義,我們可以得知,處于最大堆的根節(jié)點的元素一定是這個堆中的最大值。其實我們的堆排序算法就是抓住了堆的這一特點,每次都取堆頂?shù)脑兀瑢⑵浞旁谛蛄凶詈竺妫缓髮⑹S嗟脑刂匦抡{(diào)整為最大堆,依次類推,最終得到排序的序列。

二、示例代碼

用python實現(xiàn)堆排序_第1張圖片

用python實現(xiàn)堆排序_第2張圖片

三、其步驟如下:

堆排序就是把堆頂?shù)淖畲髷?shù)取出,?
將剩余的堆繼續(xù)調(diào)整為最大堆,具體過程在第二塊有介紹,以遞歸實現(xiàn)?
剩余部分調(diào)整為最大堆后,再次將堆頂?shù)淖畲髷?shù)取出,再將剩余部分調(diào)整為最大堆,這個過程持續(xù)到剩余數(shù)只有一個時結束
            
              
                #_*_coding:utf-8_*_
              
              
__author__ = 
              
                'Alex Li'
              
              
                import
              
               time,random

              
                
                  def
                
                
                  sift_down
                
                
                  (arr, node, end)
                
                :
              
              
    root = node
    
              
                #print(root,2*root+1,end)
              
              
                while
              
              
                True
              
              :
        
              
                # 從root開始對最大堆調(diào)整
              
              

        child = 
              
                2
              
               * root +
              
                1
              
              
                #left child
              
              
                if
              
               child  > end:
            
              
                #print('break',)
              
              
                break
              
              
        print(
              
                "v:"
              
              ,root,arr[root],child,arr[child])
        print(arr)
        
              
                # 找出兩個child中交大的一個
              
              
                if
              
               child + 
              
                1
              
               <= end 
              
                and
              
               arr[child] < arr[child + 
              
                1
              
              ]: 
              
                #如果左邊小于右邊
              
              
            child += 
              
                1
              
              
                #設置右邊為大
              
              
                if
              
               arr[root] < arr[child]:
            
              
                # 最大堆小于較大的child, 交換順序
              
              
            tmp = arr[root]
            arr[root] = arr[child]
            arr[child]= tmp

            
              
                # 正在調(diào)整的節(jié)點設置為root
              
              
                #print("less1:", arr[root],arr[child],root,child)
              
              

            root = child 
              
                #
              
              
                #[3, 4, 7, 8, 9, 11, 13, 15, 16, 21, 22, 29]
              
              
                #print("less2:", arr[root],arr[child],root,child)
              
              
                else
              
              :
            
              
                # 無需調(diào)整的時候, 退出
              
              
                break
              
              
                #print(arr)
              
              
    print(
              
                '-------------'
              
              )


              
                
                  def
                
                
                  heap_sort
                
                
                  (arr)
                
                :
              
              
                # 從最后一個有子節(jié)點的孩子還是調(diào)整最大堆
              
              
    first = len(arr) // 
              
                2
              
               -
              
                1
              
              
                for
              
               i 
              
                in
              
               range(first, -
              
                1
              
              , -
              
                1
              
              ):
        sift_down(arr, i, len(arr) - 
              
                1
              
              )
    
              
                #[29, 22, 16, 9, 15, 21, 3, 13, 8, 7, 4, 11]
              
              
    print(
              
                '--------end---'
              
              ,arr)
    
              
                # 將最大的放到堆的最后一個, 堆-1, 繼續(xù)調(diào)整排序
              
              
                for
              
               end 
              
                in
              
               range(len(arr) -
              
                1
              
              , 
              
                0
              
              , -
              
                1
              
              ):
        arr[
              
                0
              
              ], arr[end] = arr[end], arr[
              
                0
              
              ]
        sift_down(arr, 
              
                0
              
              , end - 
              
                1
              
              )
        
              
                #print(arr)
              
              
                
                  def
                
                
                  main
                
                
                  ()
                
                :
              
              
                # [7, 95, 73, 65, 60, 77, 28, 62, 43]
              
              
                # [3, 1, 4, 9, 6, 7, 5, 8, 2, 10]
              
              
                #l = [3, 1, 4, 9, 6, 7, 5, 8, 2, 10]
              
              
                #l = [16,9,21,13,4,11,3,22,8,7,15,27,0]
              
              
    array = [
              
                16
              
              ,
              
                9
              
              ,
              
                21
              
              ,
              
                13
              
              ,
              
                4
              
              ,
              
                11
              
              ,
              
                3
              
              ,
              
                22
              
              ,
              
                8
              
              ,
              
                7
              
              ,
              
                15
              
              ,
              
                29
              
              ]
    
              
                #array = []
              
              
                #for i in range(2,5000):
              
              
                #    #print(i)
              
              
                #    array.append(random.randrange(1,i))
              
              

    print(array)
    start_t = time.time()
    heap_sort(array)
    end_t = time.time()
    print(
              
                "cost:"
              
              ,end_t -start_t)
    print(array)
    
              
                #print(l)
              
              
                #heap_sort(l)
              
              
                #print(l)
              
              
                if
              
               __name__ == 
              
                "__main__"
              
              :
    main()
            
          


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日本亚洲精品一区二区三区 | 日韩中文字幕精品久久 | 中文字幕一区二区在线视频 | 亚洲成人精品在线 | 最近中文字幕无免费视频 | 99热日韩| 日韩欧美高清在线 | 日韩欧美黄色大片 | 亚洲啪视频 | 久久亚洲综合中文字幕 | 亚洲国产综合专区在线播一一 | 婷婷 综合网站 | 亚洲免费美女视频 | 在线观看日韩一区 | 色综网| 国产视频精品视频 | 亚洲福利一区二区 | 真人毛片免费拍拍拍aa视频 | 久久天天 | 亚洲日产2021三区在线 | 一级毛片大全免费播放 | 青青青视频自偷自拍视频1 青青青手机版视频在线观看 | 欧美成人高清视频 | 亚洲第一区视频在线观看 | 国产精品99在线观看 | 国产一区二区不卡视频 | 精产网红自拍在线 | 国产精品久久久亚洲 | 亚洲欧洲一区二区三区在线观看 | 日韩精品视频一区二区三区 | 在线看片日韩 | 爱操成人网 | 中文字幕在线精品视频万部 | 欧美xxxxx九色视频免费观看 | m3u8久久国产精品影院 | 老子理论不卡影院6080 | 欧美操人视频 | 欧美日韩一区二区三在线 | 久久久久久99精品 | 天天操一操 | 免费看操片 |