插入排序
算法描述:?
1. 從第一個元素開始,該元素可以認為已經被排序?
2. 取出下一個元素,在已經排序的元素序列中從后向前掃描?
3. 如果該元素(已排序)大于新元素,將該元素移到下一位置?
4. 重復步驟 3,直到找到已排序的元素小于或者等于新元素的位置?
5. 將新元素插入到該位置后?
6. 重復步驟 2~5
現有一組數組 arr = [5, 6, 3, 1, 8, 7, 2, 4]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
編程思路:雙層循環,外循環控制未排序的元素,內循環控制已排序的元素,將未排序元素設為標桿,與已排序的元素進行比較,小于則交換位置,大于則位置不動
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
時間復雜度O(n^2)
選擇排序
算法描述:直接從待排序數組中選擇一個最小(或最大)數字,放入新數組中。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
編程思路:先假設第一個元素為最小的,然后通過循環找出最小元素,然后同第一個元素交換,接著假設第二個元素,重復上述操作即可
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
時間復雜度O(n^2)
歸并排序
算法描述:?
1. 把 n 個記錄看成 n 個長度為 l 的有序子表?
2. 進行兩兩歸并使記錄關鍵字有序,得到 n/2 個長度為 2 的有序子表?
3. 重復第 2 步直到所有記錄歸并成一個長度為 n 的有序表為止。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
編程思路:將數組一直等分,然后合并
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
時間復雜度O(nlogn)
快速排序
算法描述:
- 在數據集之中,選擇一個元素作為”基準”(pivot)。
- 所有小于”基準”的元素,都移到”基準”的左邊;所有大于”基準”的元素,都移到”基準”的右邊。這個操作稱為分區 (partition)操作,分區操作結束后,基準元素所處的位置就是最終排序后它的位置。
- 對”基準”左邊和右邊的兩個子集,不斷重復第一步和第二步,直到所有子集只剩下一個元素為止。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
上述講解了分區的過程,然后就是對每個子區進行同樣做法
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
上述版本會造成堆棧溢出,所以建議使用下面版本
原地分區版:主要區別在于先進行分區處理,將數組分為左小右大
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
時間復雜度O(nlogn)
冒泡排序
算法描述:?
1. 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。?
2. 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。在這一點,最后的元素應該會是最大的數。?
3. 針對所有的元素重復以上的步驟,除了最后一個。?
4. 持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。5.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
編程思路:外循環控制需要比較的元素,比如第一次排序后,最后一個元素就不需要比較了,內循環則負責兩兩元素比較,將元素放到正確位置上
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
時間復雜度O(n^2)
參考資料
排序效果?
常見排序算法?
排序算法 維基百科