用python進行氣泡排序

2021-09-27 13:51:15 字數 1803 閱讀 5932

什麼是氣泡排序?

氣泡排序是將是將一堆無序的元素,通過方法、函式將他們變為有序。【就像是水中冒泡一樣,把其中最大(小)的乙個乙個冒出來】

氣泡排序的原理:

通過函式將第乙個元素與其後面的元素進行比較,選出較大(小)的乙個,然後繼續跟後面的比較,直至比較最後乙個。

也就是說通過第一輪比較後列表的末尾的元素應該是這個列表中最大(小)的元素。【理解這個原理,氣泡排序就算是完成一半了】

氣泡排序原理圖:

輸出結果:

[2, 4, 5, 21, 24, 25, 32, 32, 32, 33, 252, 535]

原理解釋:

1.首先我們需要弄清氣泡排序的原理:拿出列表中的乙個數跟其下乙個屬比較,所以我們就可以得到:

a = [21,33,2,4,535,25,252,32,32,24,5,32]

for i in range(len(a)-1):

if a[i] > a[i+1]:

其中 len(a)-1 是因為要比較 n-1 次:這裡有12個元素,也就是比較11次,這個沒毛病吧。

len(a)就是a列表的長度12,range(len(a)-1) == range(0:11) ,其中 0:11 一共有(11-0)個數(取頭不取尾),繞來繞去也就是想說明乙個問題:我們遍歷了 0~ n-1 【這裡可能比較難理解】【注意區分下標和次數】

比較之後需要將他們換位置:

a = [21,33,2,4,535,25,252,32,32,24,5,32]

for i in range(len(a)-1):

if a[i] > a[i+1]:

a[i],a[i+1] = a[i+1],a[i]

print(a)

這樣內層函式就做好了,這個時候輸出的 a 只會把最大的輸出來,而我們需要把每個最大的都列印出來,同理就需要將這一整個for迴圈再迴圈幾遍,那麼到底迴圈幾遍呢?

沒錯就是 n-1 遍:

a = [21,33,2,4,535,25,252,32,32,24,5,32]

for j in range(len(a)-1):

for i in range(len(a)-1-j):

if a[i] > a[i+1]:

a[i],a[i+1] = a[i+1],a[i]

print(a)

完了,就這樣了!

沒看懂?

少了個 j 沒錯,接下來還有乙個比較難理解的地方:【對於整個迴圈】

第一次迴圈: j = 0, i走到–>n-2 range(0, n-1)

第二次迴圈: j = 1, i~n-3 range(0, n-1-1)

第三次迴圈: j = 2, i~n-4 range(0, n-1-1-1)

可得: range(0, n-1-j)

引入 j 的意思:

每次迴圈後我們就不需要管已經排好序的數了。

外層迴圈控制走多少次,內層迴圈控制從頭走到尾。

第一次看不懂沒關係,多試幾次就好了。

用python實現氣泡排序

氣泡排序 冒泡法也稱沉底法,沒相鄰兩個記錄關鍵字比較大小,大的記錄往下沉 也可以小的網上浮 每一遍把最後乙個下沉的位置記下,下一遍只需檢查比較到此位置 到所有記錄都不發生變化時,整個過程結束 每交換一次,記錄減少乙個反序數 有一組資料 83,16,9,96,27,75,42,69,34 在開始時83...

小記 用python進行排序

linux 中可以使用 sort 進行排序,python中也一樣,那麼怎樣實現把乙個數字的 list 從小到大排序,然後寫入檔案,然後從檔案中讀取出來檔案內容,然後反序,再追加到檔案的下一行中呢?思路如下 1 取乙個列表內容 2 對列表內容使用 sort 進行排序,並列印出結果 3 開啟乙個檔案,將...

用冒泡法對引用型別進行排序

這篇博文涉及到的知識點 1 定義引用型別的陣列 2 為引用型別新增了乙個比較的方法compare 3 重寫了tostring方法 4 用到了氣泡排序 源 如下 public class testdatesort 用氣泡排序法,進行排序 public static void bubblesort da...