1. 程式人生 > 實用技巧 >演算法-03-氣泡排序

演算法-03-氣泡排序

'''
1.排序演算法: 也即是把一串無序的資料,依照特定的順序進行排列的演算法.實現從無序到有序的演算法
2.穩定性: 將如下一組元組,按元組中第一個元素大小進行排序進行: (4, 1) (3, 1) (3, 7) (5, 6)
在這種情況下有可能產生兩種結果:
(1) (3, 1) (3, 7) (4, 1) (5, 6)
(2) (3, 7) (3, 1) (4, 1) (5, 6)
第(1)種保持了原來(3, 1) (3, 7)的前後順序,這種我們稱為穩定的.
第(2)種改變了原有資料這倆元組的前後順序,我們稱這是不穩定的.

也即若是一種排序能夠保證,相等的對比元素,在排序後仍能夠保持原有前後順序的話,那我們就稱這種排序演算法為穩定的.
例如此處(3, 1)與(3, 7)中的對比元素都為3,因此實現這兩個元組的前後順序,在排序後不發生改變的第(1)組演算法為穩定排序演算法.
3.雙層for迴圈: 注意了這是你的一個思維誤區,在雙層for迴圈的情況下,第二個for迴圈也屬於一個獨立的for迴圈,程式會把第二個for迴圈執行一次從 0-n
後才執行一次第一個for迴圈,這也是為什麼雙層for迴圈的時間複雜度為 n*n 的原因.
以後你遇到雙層for迴圈時,就在腦子裡執行一次從 0-n 的第二個for迴圈.

'''
'''
所謂氣泡排序,也即是一個元素一個元素的比較大小,最終實現最大的那個元素排在了末尾.這玩意你應該不需要記筆記,因為只要領悟一遍基本上就能記住.
'''
def bubble_sort(alist):
n = len(alist)
for j in range(n-1): # 第一個for迴圈是為了避免重複的從頭比到尾,因為經過排序後最後一個數一定是最大的,所以沒必要再與最後一個數進行對比.
count = 0 # 這裡建立count能夠簡化程式的時間複雜度,當原資料已是按規則順序排序時,可以直接退出,避免無用的再次排序.如[1,2,3,4],這就是一組規則的資料,無需在按大小順序重新排序.

for i in range(0, n-1-j): # 第二個for迴圈是實現元素移動,與對比交換位置的.
if alist[i] > alist[i+1]: # 注意了沒必要去理會當 alist[i+1]>alist[i] 的情況,因為你若是自己推的話能發現,這個迴圈神奇的就把這種情況給避免了
alist[i], alist[i+1] = alist[i+1], alist[i]
count += 1
if count == 0: # 注意了這裡有一個誤區,這個if條件是寫在第二個for迴圈後的,因此只有當第二個for迴圈,迴圈一次從0到(n-1-j)次之後,
return # 才會進行count值的判斷,也即他是不會出現[1, 2, 4, 3]這種前部分是按順序,後半部分不按順序也會退出的情況的.到底為什麼,還需要你深刻的理解什麼是二重for迴圈.

if __name__ == '__main__':
# li = [54, 26, 93, 17, 77, 31, 44, 55, 20]
li = [1, 2, 3, 5, 4]
print(li)
bubble_sort(li)
print(li)