排序算法:冒泡排序

算法的大致思想

假设有一个含7个元素的随机数组arr=[77, 64, 2, 43, 7, 49, 78]

第一次迭代分析

假设我们最终的期望的排序结果是从小到大;我们就可以依次比较相邻的两个元素(使用python的索引机制,其中i表示元素的索引,初始值为0)
在这里插入图片描述

若左边元素大于右边,两者互换位置,i+1,
若左边元素小于右边元素,不做任何操作,i+1

在这里插入图片描述

将所有相邻的元素都比较一遍,共6次,(此时i的值为5,i+1的值为6,我们不希望索引值i超出(7-1)),我们称为完成了第一次迭代

第二次迭代分析

我们将i的值变为0,在第一次迭代基础上,重复第一次迭代时元素的操作内容,即比较相邻元素,然后互换位置
在这里插入图片描述

规律

从上面我们可以看到,每一次迭代都将当前数组中的最大值转移到数组的最右端(冒泡排序名称的由来),也就是说第二次迭代时不用再比较倒数第二个元素和倒数第一个元素,第三次迭代时不用再比较倒数第三个和倒数第二个元素

确定迭代次数

根据上面规律,第一次迭代后,倒数最后一个元素有序;第二次迭代后,倒数后两个元素有序,…,第n-1次迭代后,倒数后n-1个元素有序,排序完成,共完成(n-1)次排序

迭代过程代码优化

根据上面规律,我们将n次迭代过程使用for循环表示,并且第二次迭代,i+1不必等于6(最后一个元素),第三次迭代,i+1不必等于5(倒数第二个元素),…,第n-1次迭代,i+1不必等于1(倒数第n-1个元素)

迭代过程实现

第一次迭代

def b_sort(arr):
    for i in range(len(arr)-1):
        if arr[i]>arr[i+1]:
            arr[i],arr[i+1]=arr[i+1],arr[i]
        print(arr)
    print('第1次排序结束')

b_sort(arr)
'''
[64, 77, 2, 43, 7, 49, 78]
[64, 2, 77, 43, 7, 49, 78]
[64, 2, 43, 77, 7, 49, 78]
[64, 2, 43, 7, 77, 49, 78]
[64, 2, 43, 7, 49, 77, 78]
[64, 2, 43, 7, 49, 77, 78]
第1次迭代结束'''

代码的运行结果与我们分析的结果相同,但这还达不到我们排序的目的

第二次迭代过程

def b_sort(arr):
	# 第一次
    for i in range(len(arr)-1):
        if arr[i]>arr[i+1]:
            arr[i],arr[i+1]=arr[i+1],arr[i]
        print(arr)
	# 第二次
    for i in range(len(arr)-1):
        if arr[i]>arr[i+1]:
            arr[i],arr[i+1]=arr[i+1],arr[i]
        print(arr)
'''

'''        

最终代码

def b_sort(arr):
    for j in range(len(arr)-1):
        for i in range(len(arr)-1-j):
            if arr[i]>arr[i+1]:
                arr[i],arr[i+1]=arr[i+1],arr[i]
            print(arr)
        print(f'第{j+1}次排序结束')
'''
[64, 77, 2, 43, 7, 49, 78]
[64, 2, 77, 43, 7, 49, 78]
[64, 2, 43, 77, 7, 49, 78]
[64, 2, 43, 7, 77, 49, 78]
[64, 2, 43, 7, 49, 77, 78]
[64, 2, 43, 7, 49, 77, 78]
第1次排序结束
[2, 64, 43, 7, 49, 77, 78]
[2, 43, 64, 7, 49, 77, 78]
[2, 43, 7, 64, 49, 77, 78]
[2, 43, 7, 49, 64, 77, 78]
[2, 43, 7, 49, 64, 77, 78]
第2次排序结束
[2, 43, 7, 49, 64, 77, 78]
[2, 7, 43, 49, 64, 77, 78]
[2, 7, 43, 49, 64, 77, 78]
[2, 7, 43, 49, 64, 77, 78]
第3次排序结束
[2, 7, 43, 49, 64, 77, 78]
[2, 7, 43, 49, 64, 77, 78]
[2, 7, 43, 49, 64, 77, 78]
第4次排序结束
[2, 7, 43, 49, 64, 77, 78]
[2, 7, 43, 49, 64, 77, 78]
第5次排序结束
[2, 7, 43, 49, 64, 77, 78]
第6次排序结束'''        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夺笋123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值