排序算法-冒泡排序-python

本文详细介绍了冒泡排序算法的工作原理,包括升序和降序的排序过程,并通过具体实例进行演示。此外,还提供了两种不同的Python实现方式,帮助读者更好地理解和掌握冒泡排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 冒泡排序法说明

  • 冒泡法
    • 属于交换排序
    • 两两比较大小,交换位置。如同水泡咕嘟咕嘟往上冒
    • 结果分为升序和降序排列
  • 升序
    • n个数从左至右,编号从0开始到n-1,索引0和1的值比较,如果索引0大,则交换两者位置,如果索引1大,则不交换。继续比较索引1和2的值,将大值放在右侧。直至n-2和n-1比较完,第一轮比较完成。第二轮从索引0比较到n-2,因为最右侧n-1位置上已经是最大值了。依次类推,每一轮都会减少最右侧的不参与比较,直至剩下最后2个数比较。
  • 降序
    • 和升序相反

2. 冒泡排序法举例

初始1 9 8 5 6 7 4 3 2
第一趟1 8 9 5 6 7 4 3 21 8 5 9 6 7 4 3 21 8 5 6 9 7 4 3 21 8 5 6 7 9 4 3 2
1 8 5 6 7 4 9 3 21 8 5 6 7 4 3 9 21 8 5 6 7 4 3 2 9
第二趟1 8 5 6 7 4 3 2 91 5 8 6 7 4 3 2 91 5 6 8 7 4 3 2 91 5 6 7 8 4 3 2 9
1 5 6 7 4 8 3 2 91 5 6 7 4 3 8 2 91 5 6 7 4 3 2 8 9
第三趟1 5 6 7 4 3 2 8 91 5 6 4 7 3 2 8 91 5 6 4 3 7 2 8 91 5 6 4 3 2 7 8 9
第四趟1 5 6 4 3 2 7 8 91 5 4 6 3 2 7 8 91 5 4 3 6 2 7 8 91 5 4 3 2 6 7 8 9
第五趟1 5 4 3 2 6 7 8 91 4 5 3 2 6 7 8 91 4 3 5 2 6 7 8 91 4 3 2 5 6 7 8 9
第六趟1 4 3 2 5 6 7 8 91 3 4 2 5 6 7 8 91 3 2 4 5 6 7 8 9
第七趟1 3 2 4 5 6 7 8 91 2 3 4 5 6 7 8 9
第八趟1 2 3 4 5 6 7 8 9

3. 冒泡法代码实现(一)

m_list = [
    [1, 9, 8, 5, 6, 7, 4, 3, 2],
    [1, 2, 3, 4, 5, 6, 7, 8, 9],
    [9, 8, 7, 6, 5, 4, 3, 2, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 2]
]

nums = m_list[0]
length = len(nums)
print(nums)

count_swap = 0
count_iter = 0
# bubble_sort
for i in range(length):
    for j in range(length -i -1):
        count_iter += 1
        if nums[j] > nums[j + 1]:
            nums[j], nums[j + 1] = nums[j + 1], nums[j]
            count_swap +=1
print(nums, count_swap, count_iter)

4. 冒泡法代码实现(二)

  • 优化实现
    • 上边的有问题
    • 下面的正确
# 错误的代码
m_list = [
    [1, 9, 8, 5, 6, 7, 4, 3, 2],
    [1, 2, 3, 4, 5, 6, 7, 8, 9],
    [9, 8, 7, 6, 5, 4, 3, 2, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 2]
]

nums = m_list[0]
length = len(nums)
print(nums)

flag = False
count_swap = 0
count_iter = 0
# bubble_sort
for i in range(length):
    for j in range(length -i -1):
        count_iter += 1
        if nums[j] > nums[j + 1]:
            nums[j], nums[j + 1] = nums[j + 1], nums[j]
            count_swap +=1
            flag = True  # swapped
    if not flag:
        break
print(nums, count_swap, count_iter)
# 正确代码
m_list = [
    [1, 9, 8, 5, 6, 7, 4, 3, 2],
    [1, 2, 3, 4, 5, 6, 7, 8, 9],
    [9, 8, 7, 6, 5, 4, 3, 2, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 2]
]

nums = m_list[1]
length = len(nums)
print(nums)

count_swap = 0
count_iter = 0
# bubble_sort
for i in range(length):
    flag = False
    for j in range(length -i -1):
        count_iter += 1
        if nums[j] > nums[j + 1]:
            nums[j], nums[j + 1] = nums[j + 1], nums[j]
            count_swap +=1
            flag = True  # swapped
    if not flag:
        break
print(nums, count_swap, count_iter)

5. 冒泡法总结

  • 冒泡法需要数据一轮轮比较
  • 可以设定一个标记判断此轮是否有数据交换发生,如果没有发生交换,可以结束排序,如果发生交换,继续下一轮排序
  • 最差的排序情况是,初始顺序与目标顺序完全相反,遍历次数1,…,n-1之和n(n-1)/2
  • 最好的排序情况是,初始顺序与目标顺序完全相同,遍历次数n-1
  • 时间复杂度O(n2)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值