1. 簡介
1.1 概念
氣泡排序(英語:Bubble Sort)是一種簡單的排序演算法。它重複地遍歷要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。遍歷數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。
1.2 步驟
氣泡排序演算法的運作如下:
- 比較相鄰的元素。如果第一個比第二個大(升序),就交換他們兩個。
- 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。
- 針對所有的元素重複以上的步驟,除了最後一個。
- 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
1.3 分析
- 最優時間複雜度:O(n) (表示遍歷一次發現沒有任何可以交換的元素,排序結束。)
- 最壞時間複雜度:O(n2)
- 穩定性:穩定
1.4 優化
-
新增 flag 引數
-
記錄上次交換的位置
-
雞尾酒排序
- 雞尾酒排序,也叫定向氣泡排序,是氣泡排序的一種改進。此演算法與氣泡排序的不同之處在於從低到高排然後從高到低,而氣泡排序則僅從低到高去比較序列中的每個元素,可以得到比氣泡排序稍微好一點的效能。
- 最差時間複雜度O(n^2)
- 最優時間複雜度-如果序列在一開始已經大部分排列過的話,會接近o(n)
- 平均複雜度-O(n^2)
2. 程式碼例項
def sort(a):
for i in range(len(a)-1, 0, -1):
for j in range(i):
if a[j] > a[j+1]:
a[j], a[j+1] = a[j+1], a[j]
# 優化1: 新增標記flag, 如果內迴圈中的判斷沒有執行,表示已經陣列是排序好的,直接退出迴圈即可
def sort_better1(a):
for i in range(len(a)-1, 0, -1):
print("i------" + str(i))
flag = True #如果下面的迴圈中的判斷沒有執行,表示已經陣列是排序好的,直接退出迴圈即可
for j in range(i):
print("j------" + str(j))
if a[j] > a[j+1]:
a[j], a[j+1] = a[j+1], a[j]
flag = False
print(a)
if flag:
break
# 優化2:記錄上次最後一次交換元素的位置,那麼次位置之後的就是已經排序好的,下次遍歷的時候就不需要再遍歷此位置之後的元素
def sort_better2(a):
last_position = len(a) - 1
for i in range(len(a)-1, 0, -1):
print("i------" + str(i))
flag = True
index = 0
for j in range(last_position):
print("j------" + str(j))
if a[j] > a[j+1]:
a[j], a[j+1] = a[j+1], a[j]
flag = False
index = j
print(a)
if flag:
break
last_position = index
# 優化3: 雞尾酒排序 雞尾酒排序,即雙向的氣泡排序,等於是氣泡排序的輕微變形。不同的地方在於從低到高然後從高到低
#(有先後順序,並非同時;大迴圈下第一個迴圈是從開始掃到結束,將最大的歸到最後;第二個迴圈是從倒數第二個位置往開始端掃,將最小的歸到開始的位置)
def sort_better3(a):
last_position = len(a) - 1
for i in range(len(a)-1, 0, -1):
print("i------" + str(i))
flag = True
index = 0
for j in range(last_position):
print("j------" + str(j))
if a[j] > a[j+1]:
a[j], a[j+1] = a[j+1], a[j]
flag = False
index = j
last_position = index
for k in range(last_position, 0, -1):
print("k------" + str(k))
if a[k] < a[k-1]:
a[k], a[k-1] = a[k-1], a[k]
flag = False
print(a)
if flag:
break
li = [2, 7, 3, 1, 5, 4, 8, 9, 10]
sort(li)
print(li)
a = [2, 7, 3, 1, 5, 4, 8, 9, 10]
#sort_better1(a)
#print(a)
b = [2, 7, 3, 1, 5, 4, 8, 9, 10]
sort_better2(b)
print(b)
c = [2, 7, 3, 1, 5, 4, 8, 9, 10]
#sort_better3(c)
#print(c)複製程式碼