冒泡排序
一、python冒泡排序算法:
#enconding = utf-8
def Bubble_Sort(listx):
#i確定比較次數
for i in xrange(len(listx)-1):
#j確定比較的是哪個元素
for j in xrange(len(listx)-1-i): #通過i確定比較到哪里
#我們可以這樣去把所有元素每次都全部比較一輪,但其實是沒有必要的,效率低。
#for j in xrange(len(listx)-1):
if listx[j]>listx[j+1]:
listx[j],listx[j+1] = listx[j+1],listx[j]
return listx
if __name__ == '__main__':
print Bubble_Sort([12,32,23,34,2])
二、過程解釋:將一個列表lista按,lista中存有n個數字按從小到大的順序進行排序。我們依次比較lista[i]和lista[i+1],如果lista[i]大於ista[i+1]就將這兩個數的位置交換,第一輪比較完成后,最大的數字會排到列表的最后。之后繼續循環排剩下的n-1個數,直到完成所有的排序,由於每次都是把最大的排到最后面,就好像冒泡一樣,故取名冒泡排序。
舉例1: lista = [41,23,5,9,20],對lista按從小到大的順序進行排序。
冒泡排序手工比較的過程:
第一輪比較:41與23比較,41>23,位置交換;41再分別向后比較,並按大小規則確定是否交換位置
第一輪比較結果:23,5,9,20,41
第一輪比較完成后,可以看到43作為列表中最大的數字已經排到了lista的最后。
第二輪比較:23與5比較,23>5,位置交換;23在依次向后比較,比較到20時停下,我們第一輪已經確定41是最大的並且移到了最后
第二輪比較結果:5,9,20,23,41
第三輪比較:5與9比較,5<9,不做交換;9和20比較,9<20也不做互換
第三輪比較結果:5,9,20,23,41
第四輪比較:5與9做比較,5<9,不做交換
第四輪比較結果:5,9,20,23,41
到這里就已經完成了對整個lista的冒泡排序了。
舉例2:
對listb=[12,32,23,34,2]按從小到大排序。
第一輪:12,23,32,2,34
第二輪:12,23,2,32,34
第三輪:12,2,23,32,34
第四輪:2,12,23,32,34
可以看出,對於一個含有n個元素的列表,冒泡比較多少次可以確保所有元素都被遍歷到?答案是 n-1次
疑問:舉例1到第二輪結束其實已經完成了對lista的排序,為什么后面還有第三輪、第四輪的比較呢?
答案:從算法的角度來講,對含有n個元素的列表比較時,是需要比較n-1次,才能確保每一個元素都被遍歷到。由於上面例子中的排列順序特殊,所以我們會感覺后面的比較其實是沒有變化的。
三、冒泡排序的時間復雜度
時間復雜度的計算方法:
1、得到算法的計算次數
2、把計算次數中,保留最大的項式,去掉其它項式
3、把最大項式的因子去掉
4、匹配上述公式,得到O表示的時間復雜度
對於冒泡排序,我們來算一下一共比較了多少次
還是用上面的例子,對listb=[12,32,23,34,2]按從小到大排序。
第一輪:12,23,32,2,34 比較4次;即n=5,比較了n-1次
第二輪:12,23,2,32,34 比較3次;即n=5,比較了n-2次
第三輪:12,2,23,32,34 比較2次;
第四輪:2,12,23,32,34 比較1次
以此類推: 冒泡排序總計比較次數應該是 n-1 + n-2 + n-3 +......+3+2+1
我們對此等差數列進行求和,Sn=n(a1+an)/2,注意:上面的式子是到n-1項,所以帶入等差數列求和公式 (n-1)*(1+n-1)/2 = n(n-1)/2
按照上面時間復雜度的計算方法,去掉其他項保留最大項,且最大的影響結果是n^2,因此結果是 n^2
故冒泡排序的時間復雜度為 O(n^2)
