冒泡排序和插入排序之間的區別

相信大部分人第一個學的排序就是冒泡排序,但真正應用時,可能會誤寫成插入排序。算法

由於這兩種排序算法實在太像了,簡直就是親兄弟。學習

 

算法名稱  最差時間複雜度  平均時間複雜度  最優時間複雜度  空間複雜度  穩定性優化

冒泡排序    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)
*/
相關文章
相關標籤/搜索