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]

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值