基础算法——冒泡排序

本算法只针对算法小白或者刚刚学习编程的同学,大神勿喷!!

冒泡排序是最最基础的一个排序算法,虽然简单,但对于理解计算机程序的运行方式很有帮助!

现在对a = [6,2,4,3,5,1]进行从大到小的排序,冒泡排序的思路是这样的:

第一轮排序:

先从a[0]和a[1]开始比较,a[0]>a[1],所以a[0]和a[1]调换位置,数列变成了[2,6,4,3,5,1],

然后a[1]和a[2]开始比较,a[1]>a[2],所以a[1]和a[2]调换位置,数列变成了[2,4,6,3,5,1],

然后a[2]和a[3]开始比较,a[2]>a[3],所以a[2]和a[3]调换位置,数列变成了[2,4,3,6,5,1]。

然后a[3]和a[4]开始比较,a[3]>a[4],所以a[3]和a[4]调换位置,数列变成了[2,4,3,5,6,1]。

然后a[4]和a[5]开始比较,a[4]>a[5],所以a[4]和a[5]调换位置,数列变成了[2,4,3,5,1,6]。

通过第一轮比较,我们就把一个最大值6,排到了最后的位置,同时我们也看到了,每一次的比较,6都会往右挪一位,最终挪到了最右侧,像一个气泡一样,一点一点升到了水面上一样,这也是为什么这个算法叫做冒泡排序的原因。

现在最大值找到了,我们开始找第二大的值,操作方式是一样的,现在数列是:

[2,4,3,5,1,6]

第二轮排序:

先从a[0]和a[1]开始比较,但是a[0]<a[1],我们的目标是把大的数“升”到数列右侧,所以a[0]和a[1]不调换位置,数列仍为[2,4,3,5,1,6],

然后a[1]和a[2]开始比较,a[1]>a[2],所以a[1]和a[2]调换位置,数列变成了[2,3,4,5,1,6]。

然后a[2]和a[3]开始比较,a[2]<a[3],所以a[2]和a[3]不调换位置,数列仍为[2,3,4,5,1,6]。

然后a[3]和a[4]开始比较,a[3]>a[4],所以a[3]和a[4]调换位置,数列变成了[2,4,3,1,5,6],

第二大的数也找到了,其他数的排序也是一样的操作,这里不做推导了,但是规律已经很明显了,每一轮排序,确定一个值的位置,如果要对6个数进行排序的话,则需要进行5轮排序即可,(因为5轮排序以后就可以确定5个数的准确位置了,最后1个数的位置自然就被确定了),

第1轮排序,数字两两之间进行了5次比较,第2轮排序,数字两两之间进行了4次比较,所以第3轮排序,数字两两之间就会进行3次比较······,规律如下

第1轮排序比较5次
第2轮排序比较4次
第3轮排序比较3次
第4轮排序比较2次
第5轮排序比较1次

根据这个规律,如果要对n个数进行排序,一共需要n-1轮排序,如果当前是第k轮排序的话,那么本轮需要比较的次数为n-k,规律如下:

第1轮排序比较n-1次
第2轮排序比较n-2次
第3轮排序比较n-3次
第4轮排序比较n-4次
第5轮排序比较n-5次
````````````
第n-1轮排序比较1次

这是一个典型的双层for循环结构,外层循环控制排序的轮数,内层循环控制每轮比较次数(很多同学大一初学此算法时,最头疼的问题就是不会写循环次数,其实直接按这个公式无脑套入即可)。

代码如下:

a = [6, 2, 4, 3, 5, 1]
for i in range(1, len(a)):
    for j in range(0, len(a) - i, 1):
        if a[j] > a[j + 1]:
            a[j], a[j + 1] = a[j + 1], a[j]
print(a)

(Python实现数组元素交换真的很方便)

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值