- 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)
-