相信大部分人第一個學的排序就是冒泡排序,但真正應用時,可能會誤寫成插入排序。
因為這兩種排序算法實在太像了,簡直就是親兄弟。
算法名稱 最差時間復雜度 平均時間復雜度 最優時間復雜度 空間復雜度 穩定性
冒泡排序 O(N^2) O(N^2) O(N) O(1) 穩定
插入排序 O(N^2) O(N^2) O(N) O(1) 穩定
兩者在數據上簡直一毛一樣,只考慮復雜度的話完全可以互相替代。
但深究的話,還是能找出許多不同:
打個比方:這是我們今天的主角小明,他機智勇敢熱愛學習樂於助人
有一天他上體育課,排的是3號位置,老師說:同學們請用冒泡排序的方法排好隊。小明覺得自己比2號的小紅高,所以互換位置,成為了2號。然后他覺得比1號小剛高,所以又互換位置排到了1號。老師說:小明,滾到最后去。最終他成了100號,這就是插入排序。
插入排序:
將無序的元素插入到有序的元素序列中,插入后仍然有序
for i in 2 to n for j in i downto 2 if array[j - 1] > array[j] swap(array[j - 1], array[j]) else break /* 從小到大排列[2,1,4,3] 第一趟排序:[1,2,4,3] 交換次數:1 比較次數:1 第二趟排序:[1,2,4,3] 交換次數:0 比較次數:1 第三趟排序:[1,2,3,4] 交換次數:1 比較次數:2 從小到大排列[4,3,2,1] 第一趟排序:[3,4,2,1] 交換次數:1 比較次數:1 第二趟排序:[2,3,4,1] 交換次數:2 比較次數:2 第三趟排序:[1,2,3,4] 交換次數:3 比較次數:3 */
冒泡排序:
比較相鄰元素,直到序列變為有序為止
for i in 1 to n for j in 1 to n - i if array[j] > array[j + 1] swap(array[j], array[j + 1]) /* 舉例:從小到大排列[2,1,4,3] 第一趟排序:[1,2,4,3] 交換次數:1 比較次數:3 第二趟排序:[1,2,4,3] 交換次數:0 比較次數:2 第三趟排序:[1,2,3,4] 交換次數:1 比較次數:1 從小到大排列[4,3,2,1] 第一趟排序:[3,2,1,4] 交換次數:3 比較次數:3 第二趟排序:[2,1,3,4] 交換次數:2 比較次數:2 第三趟排序:[1,2,3,4] 交換次數:1 比較次數:1 */
在代碼上看似差別不大,實際上兩種排序的交換次數,比較次數和每趟排序后的結果不一定相同
但交換和比較操作一般視為O(1),因此兩者時間復雜度相等
細心的童鞋會發現:這段冒泡排序的最差時間復雜度是O(N^2)而不是O(N)
因為實際上冒泡排序是可以優化的
for i in 1 to n flag = 0 for j in 1 to n - i if array[j] > array[j + 1] swap(array[j], array[j + 1]) flag = 1 if flag == 0 end /* 最差時間復雜度降為O(N) */