問題描述
記得剛剛接觸算法的時候覺得特別難以理解.最初接觸的是冒泡排序 🤣 但是現在看一遍馬上知道怎么回事,以及想到如何代碼實現.
就像是咕嚕咕嚕冒泡泡一樣.每次都是最大的泡泡冒到最上面.查看動畫是最好理解的算法的方式之一.請參看:冒泡排序動畫演示
關於冒泡排序的特性:冒泡排序的對比時間復雜度是O(n^2) 交換時間復雜度是O(n^2).最優的排序算法時間比較復雜度為O(logn)
冒泡排序的適應性相對來說比較廣泛.鏈式結構也可以使用.冒泡排序的優勢是無需任何額外的儲存開銷.選擇排序從排序思維上來說,則是冒泡排序的性能優化版本
思路
冒泡排序的算法思路在於對無序表進行多趟比較交換,
每趟包括了多次兩兩相鄰比較,並將逆序的數據項互換位置,最終能將本趟的最大項就位
一共需要n-1趟比較交換,實現整表排序
可以形象的理解為:水底的泡泡需要往上面冒.最大的泡泡先冒出去.冒出去的時候要和他的每個小弟打招呼,換換位置.好離水面最近.
比對的時間復雜度是O(n2),關於交換次數,時間復雜度也是O(n2).此外關於優化版本的冒泡排序的時間復雜度最佳可以是O(n).這種情況是在需要進行排序的表本身已經是有序表的情況下.本身已經不需要排序了.
但是經過實際測試:循環次數可以降低,但是由於需要賦值與判斷操作,排序需要的實際時間反而增加了.(測試數據有十萬個)
動畫
冒泡排序
def bubbleSort(alist):
for pass_num in range(len(alist)-1,0,-1): # 比對次數
for i in range(pass_num):
if alist[i+1] < alist[i]:
alist[i],alist[i+1] = alist[i+1] ,alist[i]
return alist
print(bubbleSort([21,312,321,321,54,654,423,12,32,312]))
優化版本
優化的內容具體體現在 : 如果發現一輪比較當中,沒有發生元素之間相互交換,則是意味着元素已經排序完畢.可以終止掉后面的排序循環.使用exchangs進行監控
def bubbleSort_II(alist): # 性能改進
exchanges = True #進行監控的變量
pass_num = len(alist) - 1
while pass_num >0 and exchanges:
exchanges = False
for i in range(pass_num):
if alist[i+1] < alist[i]:
exchanges = True
alist[i],alist[i+1] = alist[i+1] ,alist[i]
pass_num = pass_num -1
return alist
print(bubbleSort([21,312,321,321,54,654,423,12,32,312]))