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]