十大排序:冒泡排序

目录

✨冒泡排序

✨✨情景代入

✨✨思想核心

✨✨代码实现

✨✨代码改编


✨冒泡排序

✨冒泡排序也是简单算法之一,我们学习过就行了,大多数情况很少真的运用到的!


✨✨情景代入

假如小伙伴你正在第一节体育课。因为是第一节,所以你们的队伍比较参差不齐,相当于一个乱序的数组。然后体育老师来了,说了一句,按照从矮到高这样子去排啊!那你跟你的小伙伴们是怎样去改变你们的队列的呢?


✨✨思想核心

有了上面的情景,你应该能深切地感受到冒泡排序的精髓,没错!你看了看你左边的小伙伴,发现比他高,你的位置不变,看了看右边的小伙伴,发现也比他高,然后你就移动到了又来右边小伙伴的右边,再进行下一次的比较!

可以想到,冒泡排序是一类交换排序,它每次与自己的前一个数据比较(或者后一个,都可以),然后每次交换都会将较大的元素往后移,这样在经历一遍循环后,最大的元素必然会在最后面!

然后多循环几次就完成了冒泡排序!


✨✨代码实现

我们已经了解了,冒泡排序的核心思想,那我们开始着手写代码吧!

data = [int(i) for i in input().split()]
for i in range(len(data)):
    for j in range(1, len(data)-i):
        if data[j-1] > data[j]:
            data[j], data[j-1] = data[j-1], data[j]
print(data)

老样子!接收数据输入!然后我们开始遍历。因为要遍历n次,所以给一个大的循环,内部循环就是从第二个元素开始往前比较(我写的是往前比较,写成往后比较也是可以的)如果前面的数据前面的大,那么就进行交换!此次,完整的冒泡排序就已经完成啦!

好好好,那么现在问题又来啦!

如果我给你一个这样绝大多数都是有序的数组!要是还是使用原有的冒泡算法岂不是会浪费了很多时间!就像你们已经按照了老师的要求排序好了,但是现在又来了一名迟到的同学,排到了队尾,但是他不高不矮刚刚好,如果又要按照原有的代码进行跑一遍,那必然会浪费很多时间,因为本来就是大多数有序了!

arr = [161, 162, 165, 169, 170, 175, 180, 168]

就像这样!那我们是否可以修改一下代码来更快地完成这样地排序呢?


✨✨代码改编

我们是不是可以设置一个计数的东东?在存在交换时就相应计数器,若是计数器没接收到响应的话,那就是已经完全有序!那就写!

data = [int(i) for i in input().split()]
for i in range(len(data)):
    c = 0
    for j in range(1, len(data)-i):
        if data[j-1] > data[j]:
            data[j], data[j-1] = data[j-1], data[j]
            c += 1
    if c == 0:
        break
print(data)

简简单单的加上一个计数器!就可以更快速的解决上述的大部分有序的情况!

但是嗷!在无序的情况下,这个改编的代码会更慢!为什么!你看,我们又是初始化计数器,又是响应计数器,最后还多来一个检测计数器!我们写这个计数器就是为了在相对有序的情况下能够减少多余的运算,而在无序的情况下,这个计数器就会成为多余的运算!

所以啊,代码千变万化,不同的代码写法在面对不同的情况时的作用效果是不一样的!

没有最好的代码!根据实际情况来写具体的代码才是最好的!

篇幅有限~感谢您看到最后,谢谢您的欣赏!

制作不易,如果你在南墙的帖子里学到了一点点东西,那请给南墙一个小小的点赞支持一下吧

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值