算法學(xué)習(xí):冒泡排序
1、思路
對于數(shù)組s:
每一輪,遍歷數(shù)組,比較相鄰的兩個數(shù),交換位置,大的放后面;
第一輪,得到最大的數(shù),比較len(s) - 1 次
第二輪,得到第二大的數(shù)。。。。
第len(s)-1輪,得到第2小和最小的數(shù)。
所以要比較len(s)-1 輪。
2、舉例
原始數(shù)組:[9,5,4,3,2]
第一輪
? 第一次:9>5==>[5,9,4,3,2]
? 第二次:9>4==>[5,4,9,3,2]
? 第三次:9>3==>[5,4,3,9,2]
? 第四次:9>2==>[5,4,3,2,9]
第一輪排序結(jié)果:[5,4,3,2,9]
第二輪
? 第一次:5>4==>[4,5,3,2,9]
? 第二次:5>3==>[4,3,5,2,9]
? 第三次:5>2==>[4,3,2,5,9]
第二輪排序結(jié)果:[4,3,2,5,9]
第三輪
? 第一次:4>3==>[3,4,2,5,9]
? 第二次:4>2==>[3,2,4,5,9]
第三輪排序結(jié)果:[3,2,4,5,9]
第四輪
? 第一次:3>2==>[2,3,4,5,9]
結(jié)果:[2,3,4,5,9]
3、總結(jié)
對于一個長度為n的數(shù)組,進行排序歸納總結(jié):
1 對于有n個元素的數(shù)組進行排序,需要經(jīng)過n-1輪
2 第i輪比較的次數(shù)為 n-i
4、代碼
def bubble(arr): length = len(arr) #控制排序的輪數(shù) for i in range(length-1): #控制排序的次數(shù) print('第%s輪'%(i+1)) for j in range(length-1-i): print('比較第%s和第%s個數(shù):'%(j,j+1)) if arr[j]>arr[j+1]: arr[j],arr[j+1]=arr[j+1],arr[j] print('比較排序的結(jié)果是:',arr) return arr arr=[9,5,4,3,2] print(bubble(arr))
結(jié)果:
D:\>py -3 a.py
第1輪
比較第0和第1個數(shù):
比較排序的結(jié)果是: [5, 9, 4, 3, 2]
比較第1和第2個數(shù):
比較排序的結(jié)果是: [5, 4, 9, 3, 2]
比較第2和第3個數(shù):
比較排序的結(jié)果是: [5, 4, 3, 9, 2]
比較第3和第4個數(shù):
比較排序的結(jié)果是: [5, 4, 3, 2, 9]
第2輪
比較第0和第1個數(shù):
比較排序的結(jié)果是: [4, 5, 3, 2, 9]
比較第1和第2個數(shù):
比較排序的結(jié)果是: [4, 3, 5, 2, 9]
比較第2和第3個數(shù):
比較排序的結(jié)果是: [4, 3, 2, 5, 9]
第3輪
比較第0和第1個數(shù):
比較排序的結(jié)果是: [3, 4, 2, 5, 9]
比較第1和第2個數(shù):
比較排序的結(jié)果是: [3, 2, 4, 5, 9]
第4輪
比較第0和第1個數(shù):
比較排序的結(jié)果是: [2, 3, 4, 5, 9]
[2, 3, 4, 5, 9]
5、時間復(fù)雜度
使用兩層循環(huán)即可實現(xiàn)我們的冒泡排序的算法:
I.使用for循環(huán)控制排序的輪數(shù),排序的輪數(shù)為 len(s) - 1
II.內(nèi)層嵌套循環(huán)控制每輪排序的次數(shù),每輪排序的次數(shù)為n-i
III.排序過程中依次比較arr[i]與arr[i+1],大的放后面
IV.外層循環(huán)結(jié)束后返回原數(shù)組
時間復(fù)雜度:O(n^2)
浙公網(wǎng)安備 33010602011771號