1. 程式人生 > 其它 >對氣泡排序的分析與整理

對氣泡排序的分析與整理

今天咱們把常見的幾種排序演算法,整理了一下,希望能對正在看這篇帖子的你有輕微的小幫助
依照慣例,在寫每一篇帖子之前,筆者都會遵循以下幾點原則:
  1、如果一個什麼都不懂的人都能把這篇文章看懂,那就說明這篇部落格通俗易懂
  2、儘量保持排版整齊,讓讀者閱讀起來不是那麼累,簡單舒服即可
  3、儘可能的保證所寫的東西是正確的,若能幫到疑惑中的你一點點小作用,是筆者堅持寫下去的動力

一、氣泡排序
什麼是氣泡排序,它的原理是什麼?
有沒有一個人能幫我講明白其中的邏輯?
最後能不能用程式碼敲出一個例子?
如何幫大家回答這三個問題,且看我慢慢敘來。
氣泡排序:從字面意思上來理解,像氣泡一樣一個一個的從水底升上來,上面的最大,底部的最小。
原理就是比較相鄰兩個元素的大小,小的往前放,大的往後放,每經過一輪排序都可以找出最大的元素出來
比如:有一個列表【11、9、2、78、45、32、17】,現在開始以這個為例來演示。
第一輪步驟:①11比9大,所以變成9、11、2、78、45、32、17
      ②11比2大,又變成 9、2、11、78、45、32、17
      ③11比78小,位置不變,開始比較78與45,78比45大,所以變成 9、2、11、45、78、32、17
      ④78比32大,變成 9、2、11、45、32、78、17
      ⑤78比17大,變成 9、2、11、45、32、17、78
    因此,第一輪排序過後,就可以找出78這個最大元素。
      第一輪排序後的列表各元素的位置【9、2、11、45、32、17、78】
第二輪步驟:①9比2大,位置變成 2、9、11、45、32、17、78
      ②9比11小,位置不變
      ③11比45小,位置不變
      ④45比32大,位置變成 2、9、11、32、45、17、78
      ⑤45比17大,位置變成 2、9、11、32、17、45、78
      ⑥45比78小,位置不變,所以 2、9、11、32、17、45、78
    因此,第二輪排序過後,可以找出第二大的元素45
      第二輪排序後的列表各元素的位置【2、9、11、32、17、45、78】
第三輪排序:①2比9小,位置不變
      ②9比11小,位置不變
      ③11比32小,位置不變
      ④32比17大,位置變成 2、9、11、17、32、45、78
      ⑤32比45小,位置不變
      ⑥45比78小,位置不變
    因此,第三輪排序後,可以找出第三大的元素32
      所以第三輪排序後的列表各元素的位置 【2、9、11、17、32、45、78】
因此上面的那個列表經過三輪排序,就可以冒泡升序排列(從小到大排序出來)
其實,通過上面的例子,原理就是兩個相鄰的元素取比較大小,大的往右挪,小的往左挪


再看看下面的程式碼實現:

def dubble_sort(list):
    for i in range(1, len(list)):
        for j in range(0, len(list) - i):
            if list[j] > list[j + 1]:
                list[j], list[j + 1] = list[j + 1], list[j]
    return list


li1 = [11, 9, 2, 78, 45, 32, 17]

print(dubble_sort(li1))

此時,有個同學站了出來,提出一個疑問:難道氣泡排序只能從小到大,不能從大到小嗎?

其實,也可以,即使從大到小排列也是可以的,這裡我們只是為了舉例,從小到大理解起來較為容易而已,如果你想在此基礎上進行降序排列,有個reverse()方法