Python 冒泡排序過程分析

這里是冒泡排序的寫法,作為 Python 新手,我們也能夠掌握其使用
接下來,我們就一層層剖開它的面紗。首先要知道冒泡排序的原理是每輪把大的元素排在后面,我們開始模擬一下上面代碼的過程
先不管那兩層 for 循環(huán),這是比較難理解的點??吹?if 判斷,含義就是前一個數(shù)與后一個數(shù)進(jìn)行大小比較,如果前一個數(shù)比后一個數(shù)大,那么交換位置。例如當(dāng) i = 0 時,即 4 與 3 比較,由于 4 比 3 大,交換位置,變成 [3, 4, 2, 1]
len(nums) - 1 的值為 3,第一輪 j 的值為 0,進(jìn)入到內(nèi)層循環(huán),不難知道這時的 range(0, len(nums) - 1 - j) 等價于 range(0, 3),那么 i = 0 時,4 與 3 比較,交換位置,變?yōu)?[3, 4, 2, 1],由于內(nèi)層循環(huán)結(jié)束,外層循環(huán)才會繼續(xù)。所以 i = 1 時,4 與 2 比較,交換位置,變?yōu)?[3, 2, 4, 1]。繼續(xù) i = 2 時,4 與 1 比較,交換位置,變?yōu)?[3, 2, 1, 4]
內(nèi)層循環(huán)結(jié)束,跳到外層,此時第二輪 j = 1,那么 range(0, len(nums) - 1 - j) 等價于 range(0, 2),所以 i = 0 時,3 與 2 比較,交換位置,變?yōu)?[2, 3, 1, 4]。又當(dāng) i = 1 時,3 與 1 比較,交換位置,變?yōu)?[2, 1, 3, 4]
第三輪 j = 2,那么 range(0, len(nums) - 1 - j) 等價于 range(0, 1),即只有 i = 0,這時 2 和 1 進(jìn)行比較,交換位置,變?yōu)?[1, 2, 3, 4],這樣循環(huán)結(jié)束,得到了排序好的列表
再一次印證了開篇的原理,每一輪結(jié)束后把大的元素放在最后,先是最大,其次是第二大,這樣依次類推。不難看出第一層 for 循環(huán) for j in range(0, len(nums) - 1) 控制的是輪次,對于四個數(shù)而言,最多需要三輪放到后面。對于第二層 for 循環(huán) for i in range(0, len(nums) - 1 - j) 控制的是兩個數(shù)之間的比較,那么每輪減去 j 是因為,第二輪開始時,已經(jīng)在第一輪將一個最大的數(shù)排在后面,不需要再次比較了,所以減去 j 即減去 1,這樣依此類推
理解了上面的原理,我的建議是去寫一遍冒泡排序,嘗試模擬 [4, 1, 3, 2] 的排序過程