Python全栈[第九篇]:冒泡算法

  • 冒泡排序(Bubble Sort)是一种简单直观的排序算法。

      它重复比较两个相连的元素,按照大小顺序两个数字交换过来。
      越小的元素会经由交换慢慢"浮"到数列的顶端。
    

在这里插入图片描述

  • 例一:
lit = [4, 6, 5, 7, 2]

求最大值?

在这里插入图片描述
从图上可以看到,两两比较
4 > 6 ? 6大所以图2数字没有交换,
接续比较
6 >5? 6大于5,所以交换数字

可以看到总共比较了4次也就是 len(lit) - 1 次

 lit = [4, 6, 5, 7, 2]
for j in range(len(lit) - 1):
    if lit[j] > lit[j+1]:
            lit[j], lit[j+1] = lit[j+1], lit[j]
print(lit)
[4, 5, 6, 2, 7]

例二:

冒泡算法

对lit 列表进行升序排序;
可以多次循坏比较,循坏多少次?
lit 列表有len(lit)个元素,每个数都需要单独拿出来比一次,但是最后一次最后一个数肯定是最小的不需要再进行比较了,所以总次数是 len(lit) - 1

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

count 记录比较了多少次?
swap_count 记录数字交换了多少次?
通过结果思考到每次循坏比较没有必要再遍历比较后面已经确认的最大数了,所以每次比较的范围应该是递减的 range(len(lit) - 1 - i )

[4, 5, 6, 7, 2]
[4, 5, 6, 2, 7]
[4, 5, 2, 6, 7]
[4, 2, 5, 6, 7]
[2, 4, 5, 6, 7]
16 5   
[2, 4, 5, 6, 7]
lit = [4, 6, 5, 7, 2]
count = 0
swap_count = 0
for i in  range(len(lit) - 1):
    for j in range(len(lit) - 1 -i ):
        count += 1
        if lit[j] > lit[j+1]:
                lit[j], lit[j+1] = lit[j+1], lit[j]
                swap_count += 1
                print(lit)
print(count,swap_count)
print(lit)

比较的次数降低了6次,提高效率

[4, 5, 6, 7, 2]
[4, 5, 6, 2, 7]
[4, 5, 2, 6, 7]
[4, 2, 5, 6, 7]
[2, 4, 5, 6, 7]
10 5
[2, 4, 5, 6, 7]

例三:
特殊的数列
像 a = [10, 1, 2, 3, 4, 5] 只要循坏比较一次就能等到结果
可以加一个开关,控制终止程序

a = [10, 1, 2, 3, 4, 5]
out_count = 0
in_count = 0
swap_count = 0
for i in  range(len(a) - 1):
    out_count += 1
    flag = False
    for j in range(len(a) - 1 -i ):
        in_count += 1
        if a[j] > a[j+1]:
                a[j], a[j+1] = a[j+1], a[j]
                swap_count += 1
                print(a)
                flag = True
    if not flag:
        break
print(out_count, in_count, swap_count)
print(a)
[1, 10, 2, 3, 4, 5]
[1, 2, 10, 3, 4, 5]
[1, 2, 3, 10, 4, 5]
[1, 2, 3, 4, 10, 5]
[1, 2, 3, 4, 5, 10]
2 9 5
[1, 2, 3, 4, 5, 10]

out_count 外部循坏计数为 2此时程序已经执行结束.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值