<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      算法學習:堆排序

      一、關于二叉樹和堆的基本概念

      1、二叉樹

      每個節(jié)點,最多有2個子樹的數(shù)結構。
      左右子樹,也是最多有2個子節(jié)點。

      2、滿二叉樹
      除最后一層外,每個節(jié)點都有2個子節(jié)點。
       
      3、完全二叉樹
      存在的節(jié)點,和滿二叉樹的節(jié)點完全對應。
       
      4、堆:
      Max Heap:最大的元素永遠在根節(jié)點
      任一非終端節(jié)點數(shù)據(jù)均不小于其左、右孩子節(jié)點。
       
      Min Heap: 最小的元素永遠在根節(jié)點
      任一非終端節(jié)點數(shù)據(jù)均不大于其左、右孩子節(jié)點。
       
      5、堆的特點:
      i 表示索引,用公式找到索引所在節(jié)點的父節(jié)點和左右孩子節(jié)點的索引。
      parent = (i-1)//2
      c1 = 2*i+1
      c2 = 2*i+2
       
      二、堆排序的核心思想
      以Max Heap 為例:
        第一步:建堆,保證最大元素是堆頂
        第二步:把堆頂元素和最后一個元素位置交換
        第三步:調整堆結構,使堆滿足 Max Heap ,調整的時候不再考慮最后一個位置元素
        第四步:再次將堆頂元素和調整后堆的最后一個元素位置交換
        第五步:調整堆結構
        第六步:循環(huán)
       
      考慮實現(xiàn)過程:
       1.如何讓數(shù)組滿足堆的定義:建堆
      構建堆的過程:
        1)從堆的最后一個非葉子節(jié)點開始,進行調整
          對于長度為n的堆,確定最后一個非葉子節(jié)點的位置:n//2-1
          調整過程:在最后一個非葉子節(jié)點 的左右子節(jié)點中,找到最大的元素,交換位置
        2)找到倒數(shù)第二個非葉子節(jié)點,不滿足Max需要調整,滿足則不調整
        3)一直找到最后一個非葉子節(jié)點進行調整,最后滿足了Max Heap的條件
      堆頂元素和最后一個元素,交換。
      交換后破壞了原有堆的結構。
      然后縮小堆的規(guī)模,繼續(xù)調整成Max Heap。
       
      2. 調整完以后,繼續(xù)交換
       
      三、代碼
      #調整堆結果
      def heapify(arr,action_node_index,length):
          '''
          arr:要傳入的數(shù)組
          action_node_index:待調整的堆的節(jié)點的索引
          length :堆的規(guī)模
          '''
          left_child_index = 2*action_node_index+1
          right_child_index = 2*action_node_index+2
          max_value_index = action_node_index
          #分別和左右子節(jié)點比較,找到最大的值對應的index
          #在查找的堆的范圍內
          if left_child_index<length and arr[left_child_index]>arr[max_value_index]:
              max_value_index = left_child_index
          if right_child_index<length and arr[right_child_index]>arr[max_value_index]:
              max_value_index = right_child_index
          #如果最大值的索引發(fā)生了變化,交換位置
          if max_value_index!=action_node_index:
              arr[max_value_index],arr[action_node_index]=arr[action_node_index],arr[max_value_index]
              #因為位置的交換,可能導致交換后的堆不滿足堆的結構
              #繼續(xù)調整基于該節(jié)點為根的堆結構
              heapify(arr,max_value_index,length)
      
      
      #建堆:從最后一個非葉子節(jié)點
      def buildheapify(arr):
          for i in range(len(arr)//2-1,-1,-1):#左必右開,到0索引結束
              heapify(arr,i,len(arr))
      
      #堆排序
      def heapifySort(arr):
          length = len(arr)
          buildheapify(arr)
          for i in range(length):
              #做交換
              arr[0],arr[length-i-1]=arr[length-i-1],arr[0]
              #調整堆
              heapify(arr,0,length-1-i)
          return arr
      
      arr = [-111,12,0,-6,12,88,34,8,-3]
      print(heapifySort(arr))
      #結果
      [-111, -6, -3, 0, 8, 12, 12, 34, 88]

      2、時間復雜度:O(nlogn)

      posted @ 2020-12-04 18:12  hqq的進階日記  閱讀(147)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 99riav精品免费视频观看| 国产专区精品三级免费看| 日日碰狠狠添天天爽五月婷| 日本无人区一区二区三区| 久久婷婷五月综合97色直播| 亚洲人成小说网站色在线| 国产av一区二区不卡| 日本边添边摸边做边爱| 大屁股国产白浆一二区| 亚洲成片在线看一区二区| 一本色道国产在线观看二区| 99精品国产综合久久久久五月天| 亚洲午夜无码久久久久小说| 日本熟妇色xxxxx日本免费看| 91久久偷偷做嫩草影院免费看| 精品人妻无码一区二区三区| 国产粉嫩美女一区二区三| 久久精品国产亚洲av麻豆长发| 亚洲av无码精品蜜桃| 色欲综合久久中文字幕网| 国产成人8x视频一区二区| 人妻久久久一区二区三区| 婷婷色综合成人成人网小说| 久久精品国产亚洲av亚| 国产AV福利第一精品| 精品人妻伦一二三区久久aaa片| 熟女视频一区二区三区嫩草| 亚洲精品无码久久千人斩| 欧美乱大交xxxxx疯狂俱乐部| 色综合久久综合中文综合网| 视频二区国产精品职场同事| 剑河县| 四虎在线成人免费观看| 不卡在线一区二区三区视频| 人妻在线中文字幕| 亚洲精品一区二区三区综合| 成人亚欧欧美激情在线观看| 免费特黄夫妻生活片| 性欧美VIDEOFREE高清大喷水| 国产成人精品a视频一区| 国产一区二区亚洲一区二区三区|