[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 - 下濾
- 優勢
歡迎關注本站公眾號,獲取更多信息