基本原理:
1.每兩兩相鄰的兩個元素依次比較,若前乙個元素比後乙個元素大,則交換位置。第一輪比較完成後最大的數字就跑到了最後乙個,第二輪比較完成後第二大的數字就跑到了最後倒數第二個。
2.假設陣列有n個元素,則第一輪需比較n-1次,第二輪則只需比較n-2次(因為第一輪後最大的數字在最後乙個,第二輪就不用比較最後乙個數字),依此類推,共需比較n-1輪。
3.時間複雜度為o(n^2):因為一共需比較n*(n-1)/2次,
空間複雜度為o(1):因為沒有建立新的陣列,
穩定性:是個穩定的演算法,如果兩個數字相等,比較完成後其順序不會發生改變。
演算法優化:
1.設定全域性標誌位。若某輪比較後,陣列順序改變0次,即沒有發生改變,陣列已是有序,則後續便無需再繼續比較。最好的情況,陣列一開始便有序,則只需比較一輪,共比較n-1次即可,發生順序變化0次。
2.設定最後改變標誌位。若某輪比較,陣列後半截順序未發生改變,則後續比較時則無需考慮此後半截。
**如下:
def
bubble_sort
(arr)
: length =
len(arr)
# 長度為1直接返回
if length ==1:
return arr
else
:# 記錄總共比較次數
total_num =
0# 設定最後標誌位,此標誌位後的元素無需再進行比較
last_flag =
0for i in
range
(length-1)
: flag =
false
for j in
range
(length-last_flag-1)
: total_num +=
1if arr[j]
> arr[j+1]
: arr[j]
, arr[j+1]
= arr[j+1]
, arr[j]
last_flag = length-
(j+1
) flag =
true
ifnot flag:
break
print
('共比較了%d次。'
% total_num)
return arr
if __name__ ==
'__main__'
: lis =[2
,3,4
,8,5
,3,9
,10,12
]print
(bubble_sort(lis)
)# 正常比較 36次
# 設定全域性標誌位只比較了26次
# 繼續設定最大標誌位只比較了16次
氣泡排序 優化後的氣泡排序
氣泡排序法 演算法原理 依次比較相鄰兩個元素的大小,若後面的比前面的小,則交換兩個元素的位置 對每一對相鄰元素作同樣的工作,從第一對到最後一對。進行一輪比較交換下來,最後的元素就會是最小的數了,這個數就不用參與後面的比較操作了 思路 遍歷陣列,對陣列中相鄰的兩個元素進行比較,如果需要公升序,前乙個資...
優化氣泡排序(python)
記錄交換操作發生的位置,如果沒有發生交換操作,則代表排序已經可以終止 這樣一來氣泡排序最好的情況下,時間複雜度就從o n 2 優化到了o n def imroved bubble sort l length len l swaplast length 1for i in range len l si...
python 氣泡排序 優化
li 11,22,44,88,66,55,33 def maopao li n len li 遍歷列表長度減1次,最後乙個不需要比較 for i in range 1,n 建立乙個變數flag,用來記錄本輪冒泡,是否有資料交換位置 flag false 每次遍歷都獲取乙個元素,依次和後面的元素進行比...