Python实现冒泡排序详解

冒泡排序实现原理:只会操作相邻的两个数据,每次冒泡操作都会对相邻的两个元素进行比较,谁大就往后移动,直到将最大的元素排到最后面,接着再循环一趟,从头开始进行两两比较,而上一趟已经排好的那个元素就不用进行比较了。

假设待排序序列为 (5,1,4,2,8),如果采用冒泡排序对其进行升序(由小到大)排序,则整个排序过程如下所示:
1) 第一轮排序,此时整个序列中的元素都位于待排序序列,依次扫描每对相邻的元素,并对顺序不正确的元素对交换位置,整个过程如图 1 所示。

图 1 第一轮排序(白色字体表示参与比较的一对相邻元素)


从图 1 可以看到,经过第一轮冒泡排序,从待排序序列中找出了最大数 8,并将其放到了待排序序列的尾部,并入已排序序列中。

2) 第二轮排序,此时待排序序列只包含前 4 个元素,依次扫描每对相邻元素,对顺序不正确的元素对交换位置,整个过程如图 2 所示。

 图 2 第二轮排序


可以看到,经过第二轮冒泡排序,从待排序序列中找出了最大数 5,并将其放到了待排序序列的尾部,并入已排序序列中。

3) 第三轮排序,此时待排序序列包含前 3 个元素,依次扫描每对相邻元素,对顺序不正确的元素对交换位置,整个过程如图 3 所示。

  图 3 第三轮排序


经过本轮冒泡排序,从待排序序列中找出了最大数 4,并将其放到了待排序序列的尾部,并入已排序序列中。

4) 第四轮排序,此时待排序序列包含前 2 个元素,对其进行冒泡排序的整个过程如图 4 所示。

图 4 第四轮排序


经过本轮冒泡排序,从待排序序列中找出了最大数 2,并将其放到了待排序序列的尾部,并入已排序序列中。

5) 当进行第五轮冒泡排序时,由于待排序序列中仅剩 1 个元素,无论再进行相邻元素的比较,因此直接将其并入已排序序列中,此时的序列就认定为已排序好的序列(如图 5 所示)。

图 5 冒泡排序好的序列

Python实现代码为:

def func_sort(n):
    for i in range(n-1): # 控制排序次数
        for j in range(n-1-i): # 控制比较次数
            if L[j]>L[j+1]:
                print('{}比{}大,交换前{}'.format(L[j], L[j + 1], L))
                L[j], L[j + 1] = L[j + 1],L[j]
                print('交换后:{}'.format(L))
            else:
                print("我不用交换{}".format(L))
    print('排序后的列表为:{}'.format(L))
func_sort(len(L))

执行结果:

5比1大,交换前[5, 1, 4, 2, 8]
交换后:[1, 5, 4, 2, 8]
5比4大,交换前[1, 5, 4, 2, 8]
交换后:[1, 4, 5, 2, 8]
5比2大,交换前[1, 4, 5, 2, 8]
交换后:[1, 4, 2, 5, 8]
我不用交换[1, 4, 2, 5, 8]
我不用交换[1, 4, 2, 5, 8]
4比2大,交换前[1, 4, 2, 5, 8]
交换后:[1, 2, 4, 5, 8]
我不用交换[1, 2, 4, 5, 8]
我不用交换[1, 2, 4, 5, 8]
我不用交换[1, 2, 4, 5, 8]
我不用交换[1, 2, 4, 5, 8]
排序后的列表为:[1, 2, 4, 5, 8]

Process finished with exit code 0

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

芃小黄

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

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

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

打赏作者

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

抵扣说明:

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

余额充值