助你喫透那些年被捧上天的神祕算法(Python版①)

前言

算法是程序的靈魂,每個程序員,尤其是高手程序員,對算法的掌握應該是如數家珍。算法雖枯燥,但是研究透算法對你的程序功底非常有幫助。那麼用Python如何實現主流的算法呢?翻閱各大論壇大牛對Python算法的認識,我自己也粗略的對最基礎的Python算法做一下總結。

排序算法-冒泡排序:

排序:不同地點出發最後達到相同的目的,簡述爲:將一串數據依照特定順序進行排列的一種算法
在這裏插入圖片描述
冒泡排序(Bubble Sort),有時也稱爲下沉排序,是一種簡單的排序算法,它反覆遍歷要排序的列表,比較每對相鄰的項目,如果它們的順序排列錯誤(如:前大後小)則交換位置。重複傳遞列表,直到不發生交換爲止,這表明列表已排序完成。
冒泡排序分析
給出動態圖片,僅供參考哦
在這裏插入圖片描述
按照如上流程,不斷前後比較,進行交換(小的靠前,大的後退),分析可得:我們需要進行n-1次冒泡過程,才能將數值排序完成,每次對應的比較次數如下圖所示:
HaoXuan
編輯器中展示:
在這裏插入圖片描述
實現冒泡排序代碼如下:

"""冒泡排序"""
def bubble_sort(alist):

    n = len(alist)  #列表長度
    # 每次遍歷將列表中最大的元素移動到最後,共需要n-1次遍歷才能把所有的元素按照從小到大的順序排列
    for j in range(n - 1):
        # 每一次比較時,都會確定一個新元素,所以下一次需要比較時元素會比上一次減少少一個,所以:n-1-j
        for i in range(0, n - 1 - j):
            if alist[i] > alist[i + 1]:
                alist[i], alist[i + 1] = alist[i + 1], alist[i]


list0 = [50, 45, 36, 28, 35, 65, 80, 46, 23]  #值任意給定
bubble_sort(list0)
print(list0)

此時,我們來計算算法的時間複雜度爲:
f(n)= n (第一個for循環) * n (第二個for循環)
= O(n^2)

是不是感覺算法其實並不難,不難我們就接着往下走,沖沖衝…
在這裏插入圖片描述
算法不難,但是處處是坑,細心的觀衆可能已經發現上述代碼有一個缺陷:如果原列表本身就是從小到大順序排列的話,代碼仍然會繼續執行兩次循環並遍歷所有的元素,時間複雜度仍然爲O(n^2)
因此,此代碼需要改進,排除掉這種偶然情況!當列表中元素已經是從小到大時,就無需繼續執行此代碼而只需直接跳過。
優化後的代碼如下:

def bubble_sort(alist):
    """冒泡排序"""
    n = len(alist)
    # 每次遍歷將列表中最大的元素移動到最後,共需要n-1次遍歷才能把所有的元素按照從小到大的順序排列
    for j in range(n-1):  
        count = 0
        # 每一次比較時,都會確定一個新元素,所以下一次需要比較時元素會比上一次減少少一個,所以:n-1-j
        for i in range(0, n-1-j): 

            if alist[i] > alist[i+1]:
                alist[i],alist[i+1] = alist[i+1], alist[i]
                count += 1
        # 如果某次count並未變化,說明這一次元素沒有發生位置交換,即說明排序是按照從小到大排列的,不需要發生交換
        if count == 0:  
            return
list0 = [50, 45, 36, 28, 35, 65, 80, 46, 23]  ##值任意給定
bubble_sort(list0) 
print(list0)

運行結果如下:
在這裏插入圖片描述
冒泡排序時間複雜度
算法最優時間複雜度:O(n)(最好情況:本身給出的列表就是按從小到大的順序排列,直接跳過全部程序,排序結束。)
算法最壞時間複雜度:O(n^2)
算法穩定性:穩定

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