標籤:strong log nlogn .com nlog 分享圖片 一個 基礎 練習
#第一次,找到最大值
n=[3,5,1,6,2]
for i in range(len(n)-1):
if n[i]>n[i+1]:
n[i],n[i+1]=n[i+1],n[i]
print (n[-1])
#第二次,找到次大值,放在倒數第二的位置
n=[3,1,5,2,6]
for i in range(len(n)-1-1):
if n[i]>n[i+1]:
n[i],n[i+1]=n[i+1],n[i]
print (n[-2])
#第三次,找第三個最大數
n=[1,3,2,5,6]
for i in range(len(n)-1-1-1):
if n[i]>n[i+1]:
n[i],n[i+1]=n[i+1],n[i]
print (n[-3])
#第四次,找第四個最大數
n=[1,2,3,5,6]
for i in range(len(n)-1-1-1-1):
if n[i]>n[i+1]:
n[i],n[i+1]=n[i+1],n[i]
print (n[-4])
#冒泡排序最終
a= [3,5,1,6,2]
for i in range(len(a)-1): #0,1,2,3
for j in range(len(a)-1-i): #4-0;4-1;4-2;4-3
if a[j]>a[j+1]:
a[j],a[j+1] = a[j+1],a[j]
print(a)
第一次內層迴圈的結果就是找到最大的值
第二次內層迴圈的結果就是找到次大的值,本次將忽略最後一個元素的比較
第二次內層迴圈的結果就是找到第三大的值,本次講忽略倒數第二個元素和最後一個元素的比較
.......
1、冒泡排序圖示
#練習:在上面排序的基礎上,將最小的放在後面,最大的放在前面
a= [3,2,1,9,56,48,20,4,9,6,0]
for i in range(len(a)-1):
for j in range(len(a)-1-i):
if a[j]<a[j+1]:
a[j],a[j+1] = a[j+1],a[j]
print(a)
或者直接
a= [3,2,1,9,56,48,20,4,9,6,0]
for i in range(len(a)-1):
for j in range(len(a)-1-i):
if a[j]>a[j+1]:
a[j],a[j+1] = a[j+1],a[j]
print(a[::-1])
2、冒牌排序原理
冒泡排序的基本思想是,對相鄰的元素進行兩兩比較,順序相反則進行交換,這樣,每一趟會將最小或最大的元素“浮”到頂端,最終達到完全有序
3、冒泡演算法的時間複雜度
時間複雜度從小到大的排序次序為:
常數階O(1),對數階O( log n ),線性階O(n),平方階O(n^2),立方階O(n^3),...,k次方階O(n^k),指數階O(2^n)。隨著問題規模n的不斷增大,上述時間複雜度不斷增大,演算法的執行效率越低。也就是:
O(1) < O(logn) < O(n) < O(nlogn)<O(n^2) < O(n^3) <…< O(n^k)<O(2^n) <O(n!)
對於演算法來講,只看影響最大的那個因子是什麼(怎麼判斷哪個因子是影響最大的?),一般忽略分母,不看分母
#練習:計算冒泡排序的時間複雜度
遍曆第1遍時,比較了n-1次;
遍曆第2遍時,比較了n-2次;
遍曆第3遍時,比較了n-3次;
遍曆第4遍時,比較了n-4次;
……….
遍曆第n-1遍時,比較了1次;
綜上,總共比較的次數為1+2+3+4+….+(n-1)=n(n-1)/2次
因為,n(n-1)/2=n^2/2-n/2
所以,他的時間複雜度為O(n^2)
【演算法】冒泡排序