今天咱們把常見的幾種排序算法,整理了一下,希望能對正在看這篇帖子的你有輕微的小幫助
依照慣例,在寫每一篇帖子之前,筆者都會遵循以下幾點原則:
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()方法