杂学第四篇:python实现十大经典的排序算法(最简便的实现+自身理解)之冒泡排序

公示:相关概念解释及动图来源于https://www.cnblogs.com/onepixel/articles/7674659.html

此篇作为理解排序算法的一个记录,送给不怎么明白排序的小白们

 

1.冒泡排序

看图解释一下:冒泡排序的实现原理很简单,就是单纯每次做相邻两个数的比较,如果你要升序排列,那只要碰到前一个大于后一个,就交换位置,否者就略过。

def bubbleSort(lis):
    length = len(lis)
    for i in range(length - 1):
        for j in range(length - 1 - i):
            if a[j] < a[j + 1]:
                a[j], a[j + 1] = a[j + 1], a[j]
    return lis



a = [123, 45, 324, 21, 4, 56, 2, 6, 32, 56, 12, 5, 1, 5, 345]
al = bubbleSort(a)
print(al)

但是,有时候脑袋转不过来的人想要自己按这个原理实现的时候,却无法做到正确排序。只能死记正确的排序代码。这样不行的,很容易忘记。必须彻底理解,这样才能再一次需要的时候顺手拈来。

为什么明明已经知道实现原理,但是还是无法实现呢?以我的经验(额,不想承认我就是转不过来),其实需要理解其中几个细节。

  1. 我们遍历整个数组,只是将此次遍历的最大(最小)的数把他们移到最顶端。但不是遍历1次!!!所以,不管你使用while还是for,都必须是循环n-1次,n为数组长度,为什么是n-1,因为每次只能确定一位最大(最小)的数,遍历到n-1次,就能保证判断两次时候交换的时候不会产生index过界的错误,毕竟你遍历到第n遍的时候,第二次循环只有一个,还怎么跟他的下一个比?
  2. 其次,每次遍历都能把此次遍历的数字中最大(最小)的数放在最后面(前面),所以下次遍历其实不需要再去比较后面的数字,当然你去比较也没问题,只是此时的排序算法,时间复杂度要高,可以想象你排序的数量极大的时候,将更加耗时!
  3. 你看到两次嵌套循环,为什么要两个循环?第一个循环是为了第一点 ---执行遍历n次(i 在python 的for循环中默认起始为第一个,所以不需要length-1)。第二个for循环就是真正的遍历数组,将最值放在数组顶端。

以上就是我自己是思考冒泡排序时想明白之后一些感悟,留给那些懵懂不知的小白。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值