排序算法的python實現與算法分析——冒泡排序(Bubble Sort)與選擇排序(Selection Sort)

1 冒泡排序:

對無序表進行多次比較排序,分別比較兩兩相鄰的數據並互換逆序數據項,第一趟實現最大項就位,第二趟實現次大項就位,經過n-1次實現整表排序。
第一趟排序過程:
在這裏插入圖片描述
python實現源碼:

##冒泡排序  普通版
def bubblesort(alist):
    for passnum in range(len(alist)-1,0,-1):
        for i in range(passnum):
            if alist[i] > alist[i+1]:
                temp = alist[i]
                alist[i] =alist[i+1]
                alist[i+1]=temp
alist=[54,28,93,17,31,44,20]
bubblesort(alist)
print(alist)
##[17, 20, 28, 31, 44, 54, 93]

算法分析:無序表初始數據的排列狀況對其沒有影響
算法需要比對n-1趟,每次比對次數逐步從n-1減少到1,因此比對次數爲n-1的累加,即:0.5n^2-0.5。因此,時間複雜度爲O(n ^2)
注:冒泡排序通常作爲時間效率最差的排序算法,作爲其他排序算法的對比基準。但其具有無需任何額外的存儲空間開銷。

冒泡算法改進:

通過檢測每趟對比是否發生過交換,可以提前確定排序是否完成。若某趟對比沒發生任何交換,則說明已經排好序,可以提前結束。
該算法python實現:

##冒泡排序  改進版
def shortbubblesort(alist):
    exchanges=True
    passnum=len(alist)-1
    while passnum >0 and exchanges:
        exchanges = False
        for i in range(passnum):
            if alist[i]>alist[i+1]:
                exchanges =True
                alist[i],alist[i+1]=alist[i+1],alist[i]
        passnum =passnum-1

alist1=[20,30,90,50,40,60,70,80,100,110]
shortbubblesort(alist1)
print(alist1)
###  [20, 30, 40, 50, 60, 70, 80, 90, 100, 110]

2 選擇排序

選擇排序是在冒泡的基礎上進行改進,保留了多趟對比,但是每趟都使其當前最大項就位。
特點:其對交換進行了削減,其通過記錄最大項的位置,然後再與本趟最後一項進行交換,
排序實現過程:
在這裏插入圖片描述
python實現源碼:

###選擇排序  
def selectionsort(alist):
    for fillslot in range(len(alist)-1,0,-1):
        positionofmax=0
        
        for location in range(1,fillslot+1):
            if alist[location] > alist[positionofmax]:
                positionofmax =location
        temp =alist[fillslot]
        alist[fillslot]=alist[positionofmax]
        alist[positionofmax]=temp

alist2=[0,1,6,7,9,3,12,16,8]
selectionsort(alist2)
print(alist2)
### [0, 1, 3, 6, 7, 8, 9, 12, 16]

算法分析:還是經過了n-1趟,每趟對比次數從n-1逐漸減少到1,因此時間複雜度仍然爲O(n^2)。但是交換次數減少到O(n)次。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章