最近好多小伙伴問到冒泡排序如何寫,忍不住上網查了一下,發現網上的資料大多只講了代碼呈現,但是並沒有講數學邏輯。其實這種代碼,你首先要把數學邏輯弄懂了,然后再去轉化計算機語言,只要懂相關語言的語法,不管怎么變語言,邏輯都不變。下面正式開始我們的主題。
1.冒泡排序的算法邏輯:

注:關鍵字是相鄰元素,即冒泡排序是只針對2個挨着的元素比較的。然后每一趟找出最大的數。
2.數學邏輯
給你9個數,分別為:55,44,11,77,66,99,88,33,22。
第0趟:
第0次: 44,55,11,77,66,99,88,33,22 (44和55比較,55大於44,故這2個調位置)
第1次: 44,11,55,77,66,99,88,33,22 ( 55和11比較,55大於11,故這2個調位置)
第2次: 44,11,55,77,66,99,88,33,22 ( 55和77比較 ,55<77,故位置不變)
第3次: 44,11,55,66,77,99,88,33,22 (77和66比較,77大於66,故這2個調位置)
第4次: 44,11,55,66,77,99,88,33,22 (77和99比較,77<99,故位置不變)
第5次: 44,11,55,66,77,88,99,33,22 (99和88比較,99大於88,故這2個調位置)
第6次: 44,11,55,66,77,88,33,99,22 (99和33比較,99大於33,故這2個調位置)
第7次: 44,11,55,66,77,88,33,22,99 (99和22比較,99大於22,故這2個調位置)
結果最大的99排在最后,第0趟結束,一共比較了8次
注:此次最大的已經在最后了,故以后不再比較99了。
第1趟:
第0次: 11,44,55,66,77,88,33,22,99 (44和11比)
第1次: 11,44,55,66,77,88,33,22,99 (44和55比)
第2次: 11,44,55,66,77,88,33,22,99 (55和66比)
第3次: 11,44,55,66,77,88,33,22,99 (66和77比)
第4次: 11,44,55,66,77,88,33,22,99 (77和88比)
第5次: 11,44,55,66,77,33,88,22,99 (88和33比)
第6次: 11,44,55,66,77,33,22,88,99 (88和22比)
結果88和99占據高位,第1趟比較結束,一共比較了7次
注:此次88排在倒數第二位,此后88和99不再參加比較了。
第2趟:
第0次: 11,44,55,66,77,33,22,88,99 (11和44比較)
第1次: 11,44,55,66,77,33,22,88,99 (44和55比較)
第2次: 11,44,55,66,77,33,22,88,99 (55和66比較)
第3次: 11,44,55,66,77,33,22,88,99 (66和77比較)
第4次: 11,44,55,66,33,77,22,88,99 (77和33比較)
第5次: 11,44,55,66,33,22,77,88,99 (77和22比較)
結果77,88,99占據高位,第2趟比較結束,一共比較6次
注:此次77排在倒數第三位,此后77,88,99不再參加比較了。
第3趟:
第0次: 11,44,55,66,33,22,77,88,99 (11和44比較)
第1次: 11,44,55,66,33,22,77,88,99 (44和55比較)
第2次: 11,44,55,66,33,22,77,88,99 (55和66比較)
第3次: 11,44,55,33,66,22,77,88,99 (33和66比較)
第4次: 11,44,55,33,22,66,77,88,99 (66和22比較)
結果66,77,88,99占據高位,第3趟比較結束,一共比較5次
注:此次66排在倒數第四位,此后66,77,88,99不再參加比較了。
第4趟:
第0次: 11,44,55,33,22,66,77,88,99 (11和44比較)
第1次: 11,44,55,33,22,66,77,88,99 (44和55比較)
第2次: 11,44,33,55,22,66,77,88,99 (55和33比較)
第3次: 11,44,33,22,55,66,77,88,99 (22和33比較)
結果55,66,77,88,99占據高位,第4趟比較結束,一共比較4次
注:此次55排在倒數第四位,此后55,66,77,88,99不再參加比較了。
第5趟:
第0次: 11,44,33,22,55,66,77,88,99 (11和44比較)
第1次: 11,33,44,22,55,66,77,88,99 (44和33比較)
第2次: 11,33,22,44,55,66,77,88,99 (44和22比較)
結果44,55,66,77,88,99占據高位,第,5趟比較結束,一共比較3次
注:此次44排在倒數第五位,此后44,55,66,77,88,99不再參加比較了。
第6趟:
第0次: 11,33,22,44,55,66,77,88,99 (11和33比較)
第1次: 11,22, 33,44,55,66,77,88,99 (33和22比較)
結果33,44,55,66,77,88,99占據高位,第6趟比較結束,一共比較2次
注:此次33排在倒數第六位,此后33,44,55,66,77,88,99不再參加比較了。
第7趟:
第0次: 11,22, 33,44,55,66,77,88,99 (11和22比較)
結果22,33,44,55,66,77,88,99占據高位,第7趟比較結束,一共比較1次。
至此只剩下11一個數了,沒得比了,其他元素都比它大,在自己位置乖乖呆着就是了,所以冒泡結束。
總結:上面紅色的趟數就是我們第幾輪對目前這一排數字進行相鄰元素排序,每趟里面的次數代表相鄰2個元素比較,每兩個元素一比較算一次。
3.代碼邏輯轉換:
可以從第2步里面分析發現,主要是對幾趟進行第幾次的相鄰2個元素比較,如果前面的數大於后面的數,則這2個位置互換,否則位置不變。
主要是2個值起作用,一個是第幾趟,另一個是第幾次,而第幾次又是與第幾趟關聯的。故用i來表示第幾趟,用j來表示第幾次,發現i的取值為從0到n-2。
可以發現j的最大值是與i有關聯的,即i+j的最大值為n-2。(n為長度)
4.代碼呈現:
C語言:

運行結果:

注:此處我用的LR工具編譯的,可能別的編譯器會有所不同,基本思路一樣。
圖中的9就是這個元組的長度,lr中自定義函數一般放在action下面的。
python語言:

運行結果:

注:此處使用的pycharm工具編譯的,其他工具方法應該類似。
到次冒泡結束。
’
