排序——冒泡排序

1. 簡介

1.1 概念

冒泡排序(英語:Bubble Sort)是一種簡單的排序算法。它重複地遍歷要排序的數列,一次比較兩個元素,若是他們的順序錯誤就把他們交換過來。遍歷數列的工做是重複地進行直到沒有再須要交換,也就是說該數列已經排序完成。這個算法的名字由來是由於越小的元素會經由交換慢慢「浮」到數列的頂端。算法

1.2 步驟

冒泡排序算法的運做以下:數組

  • 比較相鄰的元素。若是第一個比第二個大(升序),就交換他們兩個。
  • 對每一對相鄰元素做一樣的工做,從開始第一對到結尾的最後一對。這步作完後,最後的元素會是最大的數。
  • 針對全部的元素重複以上的步驟,除了最後一個。
  • 持續每次對愈來愈少的元素重複上面的步驟,直到沒有任何一對數字須要比較。

1.3 分析

  • 最優時間複雜度:O(n) (表示遍歷一次發現沒有任何能夠交換的元素,排序結束。)
  • 最壞時間複雜度:O(n2)
  • 穩定性:穩定

1.4 優化

  • 添加 flag 參數優化

  • 記錄上次交換的位置spa

  • 雞尾酒排序code

    • 雞尾酒排序,也叫定向冒泡排序,是冒泡排序的一種改進。此算法與冒泡排序的不一樣之處在於從低到高排而後從高到低,而冒泡排序則僅從低到高去比較序列中的每一個元素,能夠獲得比冒泡排序稍微好一點的效能。
    • 最差時間複雜度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)複製代碼
相關文章
相關標籤/搜索