[Data Structure & Algorithm] 選擇排序+錦標賽排序+堆排序

基本思想

  • 通過比較,將最小的記錄與最前面的記錄交換位置。
    • 最前面的記錄 - 第一次是第一位,第二次是第二位,以此類推

直接選擇排序

  • 基本思想
    1.從第一個記錄開始逐個比較,將指針指向最小的記錄,直到比較完最後一個記錄
    2.將最小的記錄和最前面的記錄交換位置
    3.再次循環從第二個記錄開始比較,將第二小的記錄交換到第二位,依次進行,直到全部記錄排序完成
  • 優勢 - 移動記錄的次數較少
    • 最好狀況 - 正序 - 無需移動
    • 最壞狀況 - 逆序 - n-1次交換,每次交換移動3次
  • 缺點 - 比較記錄的次數較多 - n*(n-1)/2
  • 時間複雜度 - O(n2)

樹形選擇排序(錦標賽排序)

  • 基本思想
    • 第一輪排序,把全部記錄做爲樹的最後一層,兩兩分組(若是共有奇數個記錄,則最後補上∞),取其中較小的記錄做爲倒數第二層
    • 依次類推,最終獲得的根結點即爲這一輪中的最小值
    • 第二輪排序,將上一輪中的最小值用∞表示,從新構造樹,新的根結點即爲這一輪的最小值
  • 優勢 - 比較次數相對直接選擇較小
  • 缺點
    • 比較次數中包括屢次與∞的比較
    • 須要額外的空間
  • 時間複雜度 - O(nlog2n)

堆排序(優先隊列)

  • 二叉堆
    • 性質
      • 徹底二叉樹
      • 全部非葉子結點都不大於其左、右孩子結點
    • 表示 - 數組
      • 對於數組中元素Array[i],他的左孩子是Array[2i],右孩子是Array[2i+1],父節點是Array[i/2]
    • 操做
      • 插入 Insert - 上濾
        1.找到最後一個非葉子結點,即最後一個葉子結點的父節點Array[n/2]
        2.以這個結點爲根結點,與其左右孩子比較,將最小值調整爲根結點
        3.繼續調整與這個結點在同一層的其餘結點
        4.這層調整完後,向上一層進行比較,此時若是有交換,須要注意交換後的結點是否會影響其做爲根結點的堆結構
      • 刪除最小值 DeleteMin - 下濾
        1.當前根結點(即最小值)移除後,將最後一個葉子結點交換至根結點,獲得新的根結點
        2.將如今的根結點與其左右孩子比較,把較小的值交換到根結點
        3.若是有交換,則這個孩子的子樹的堆結構可能被破壞,重複2,直到最後一層的葉子結點
  • 基本思想
    1.構造二叉堆 - 上濾
    - 按照輸入順序,先構造一個徹底二叉樹,再用上濾操做構造二叉堆
    2.DeleteMin - 下濾
  • 優勢
    • 空間上 - 只須要一個額外空間進行交換
    • 時間上
      • 最壞狀況 - O(nlog2n)
相關文章
相關標籤/搜索