学习笔记之-冒泡排序

最近老是被领导提问(夺笋啊!!!!!),大学学的数据结构已经忘光了,于是重新看一下,下次被问的时候好歹能记得,做个笔记,记录一下。

一、冒泡排序

1.1、什么是冒泡排序?

冒泡排序是一种稳定(至于为啥稳定下面再说)的常见排序算法,为啥叫他冒泡,是因为元素可以像气泡一样按照自身的大小一点点的向一侧移动,最后移到最右边的就是最大或最小的。冒泡排序的原理就是多次的去遍历需要排序的列表比较相邻的两个元素大小并交换(or不变),一直遍历到最后不需要遍历为止,此时整个序列都不存在比最右边的数字大(小)的元素。然后就在n-1个元素中,比较相邻的两个元素,再一点点向右移动,这么比较个n-1次,完成排序。

所以这里面有两个数值是最值得关注的,一个是遍历的次数,这决定了我们最外层循环要怎么写,一个是比较的次数,这决定了我们内层循环的数值怎么写。

1,2,3 … n-1,n

第一次遍历:
比较次数1 第一个数和第二个数,
比较次数2 第二个数和第三次数

比较次数n-1 第n-1个数和第n个数

第二次遍历:
比较次数1 第一个数和第二个数
比较次数2 第二个数和第三个数

比较次数n-1-1 第n-1-1个数和第n-1个数

遍历的次数:由于一次遍历只能排出一个最大(小)值到最右边,所以一共有n个数字的话,要遍历个n-1次才能把所有的数字都排好,也就是外层循环的次数是n-1次(但我看好多人写的冒泡都遍历了n次,我个人感觉比较个n-1就行了,仅代表个人观点,无任何科学依据,可杠可黑,狗头保命);
每次遍历比较的次数:第X次遍历,会比较n-x次,所以内层循环的次数是n-x次(注:这里的X指的是第X次比较)

基于以上,冒泡排序的python代码如下:

#对一个有n个数的列表进行冒泡排序
arr1 = [3,5,1,34,64,1,8,45,2]
n = len(arr1)
for i in range(n-1):
    for j in range(n-i-1):#这里是n-i-1是因为i是从0开始,i=0时对应的其实是第一次排序
        if arr1[j]>arr1[j+1]:
            arr1[j],arr1[j+1] = arr1[j+1],arr1[j]
print(arr1)#打印一下排序后的列表
1.2、为什么说冒泡排序是稳定的?

首先理解一下什么是稳定的排序算法,稳定的排序算法是如果排序的序列中,有几个元素的值相同,先后顺序不同,经过排序后,这几个值仍然是按照原本的先后顺序在排序后的序列中展示的,那么称之为稳定的排序算法;
而对于冒泡排序来说,假定有一个列表:
a=[2,1,3,1,1,3]
对列表a进行冒泡排序时,会比较的是相邻的两个元素,出现元素1大于或小于元素2时(升序or降序)才发生交换,当元素1等于元素2时,不会发生交换,所以数值相等的两个元素,前后顺序永远不会发生变化,所以冒泡排序是稳定的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值