數據結構與算法 - 03排序 (冒泡、插入、歸併、快速、拓撲)

  • 1. 冒泡排序 Bubble Sort
    • 基本思想
      • 給定一個數組,這些元素將通過相互之間的比較,按照大小順序一個個地像氣泡一樣浮出水面
    • 實現
      • 每一輪,從頭部開始,每兩個元素比較大小進行交換,直到這一輪中最大或最小元素被放置到尾部,不斷重複,直到所有元素都排好位置
    • 代碼示例

    • 時間複雜度
      • O(n2)
      • 穩定的排序算法
        • 指如果數組裏兩個相等的數,那麼排序前後這兩個相等的數的相對位置保持不變
  • 2. 插入排序 Insertion Sort
    • 基本思想
      • 不斷地將尚未排好序的數,插入到已經排好序的部分
    • 特點
      • 冒泡排序中,經過每一輪的排序處理後,數組後端的數是排好序的
      • 插入排序中,經過每一輪的排序處理後,數組前段的數是排好序的
    • 解題思路
      • 將數組分成左右兩個部分,左邊是已經排好序的部分,右邊是沒排序的部分
      • 剛開始時,左邊只有第一個元素
      • 接下來,對右邊的元素一個個進行處理,將他們放到左邊
    • 代碼示例

    • 時間複雜度
      • O(n2)
      • 穩定的排序算法
    • 練習
      • LC147:對一個鏈表進行插入排序
  • 3. 歸併排序 Merge Sort
    • 基本思想
      • 分治
      • 把複雜的問題分成兩個或多個相同或相似的子問題,
      • 然後把子問題分成更小的子問題,直到子問題可以簡單的直接求解,
      • 圓問題的解,就是子問題解的合併
    • 實現
      • 先把數組從中間劃分成兩個子數組,一直遞歸地把子數組劃分成更小的子數組,直到子數組裏只有一個元素,纔開始排序
      • 排序方法:按照大小順序合併兩個元素,接着依次按照遞歸的返回順序,不斷地合併排好序的子數組,直到最後把整個數組的順序排好
    • 代碼示例

    • 時間複雜度
      • O(nlogn)
      • 穩定的排序算法
  • 4. 快速排序 Quick Sort
    • 基本思想
      • 分治
    • 實現
      • 從原始的數組,選取一基準值,篩選成較小和較大的兩個子數組,然後從兩個子數組不斷地挑選基準值,進行遞歸排序,當所有的子數組的元素個數都爲 1 時結束
    • 代碼示例

    • 複雜度
      • 時間 最優:O(nlogn) 最壞:O(n2)
      • 空間 O(logn)
    • 練習
      • LC 215:給定一個尚未排好序的數組,要求找出第 k 大的數
        • 1 直接將數組進行排序,然後得出結果
        • 2 快速排序:每次隨機選取一個基準值,將數組分成較小的一半和較大的一半,然後檢查這個基準值最後所在的下標是不是 k,算法複雜度只需要 O(n)
  • 5. 拓撲排序 Topological Sort
    • 前提
      • 1. 圖必須是有向圖
      • 2. 圖裏面沒有環
    • 用途
      • 用來理清具有依賴關係的任務
    • 實現
      • 1. 將問題用一個有向無環圖進行抽象表達,定義出哪些是圖頂點,頂點之間如何互相關聯
      • 2. 可以利用廣度優先搜索 深度優先搜索 進行拓撲排序
    • 實現
      • 選擇一個沒有前驅(入度爲 0)的頂點,輸出,然後刪除該頂點及相關的有向邊
      • 重複上述操作
    • 代碼示例

    • 時間複雜度
      • O(n)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章