相信大部分人第一個學的排序就是冒泡排序,但真正應用時,可能會誤寫成插入排序。算法
由於這兩種排序算法實在太像了,簡直就是親兄弟。學習
算法名稱 最差時間複雜度 平均時間複雜度 最優時間複雜度 空間複雜度 穩定性優化
冒泡排序 O(N^2) O(N^2) O(N) O(1) 穩定spa
插入排序 O(N^2) O(N^2) O(N) O(1) 穩定code
二者在數據上簡直一毛同樣,只考慮複雜度的話徹底能夠互相替代。blog
但深究的話,仍是能找出許多不一樣:排序
打個比方:這是咱們今天的主角小明,他機智勇敢熱愛學習樂於助人class
有一天他上體育課,排的是3號位置,老師說:同窗們請用冒泡排序的方法排好隊。小明以爲本身比2號的小紅高,因此互換位置,成爲了2號。而後他以爲比1號小剛高,因此又互換位置排到了1號。老師說:小明,滾到最後去。最終他成了100號,這就是插入排序。方法
插入排序:im
將無序的元素插入到有序的元素序列中,插入後仍然有序
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) */