Python冒泡排序的遞歸和非遞歸實現

Python冒泡排序的遞歸和非遞歸實現

遞歸實現:

#冒泡排序遞歸的實現
#flag標記某次for循環是否有數字交換,沒有則認爲ls已經有序
#i的取值從0到len-1,因爲涉及兩數比較,i和i+1,則i最大取到倒數第二個數,i+1取到最後一個數
#按冒泡邏輯,每一輪for循環會有序一個最大數字在隊尾
#從算法效率考慮每一輪for循環,後繼循環範圍應該減1,
#本實現遞歸調用一重for循環實現冒泡排序,相對比較簡單
#對隊列規模較小情況下,執行效率影響不大。
ls = [23,41,32,12,56,76,35,67,89,44]
print(ls)
def bub_sort(s_list):
    flag = 0#無數據交換
    for i in range(len(s_list)-1):
        if s_list[i] > s_list[i+1]:
            flag = 1#有交換
            s_list[i],s_list[i+1] = s_list[i+1],s_list[i]
    if flag == 1:#有交換,則遞歸調用bub_sort
        bub_sort(s_list)
    else:
        return s_list
bub_sort(ls)
print(ls)


非遞歸實現:

#用2重循環實現冒泡排序
#外循環控制標記變化
#注由於外循環只控制標記變化,不考慮2數比較,所以循環範圍無需len-1
#flag如無變化,說明列表已經有序
#內循環實現具體排序,即相鄰2數交換位置

#ls = [7,6,5,4,3,2,1]
ls = [23, 41, 32, 12, 56, 76, 35, 67, 89, 44]
print(ls)
def bub_sort(s_list):
#    for i in range(len(s_list)-1):
    for i in range(len(s_list)):
        flag = 1
        for j in range(len(s_list)-1-i):#內循環次數-i
            if s_list[j] > s_list[j+1]:
                s_list[j],s_list[j+1] = s_list[j+1],s_list[j]
                flag = 0
        if flag:#如果已經有序,則跳出for循環
            break
    return s_list
bub_sort(ls)
print(ls)

結果:

[23, 41, 32, 12, 56, 76, 35, 67, 89, 44]
[12, 23, 32, 35, 41, 44, 56, 67, 76, 89]

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