排序——氣泡排序

Dictator丶發表於2019-01-24

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)複製程式碼

相關文章