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]