鱼C论坛

 找回密码
 立即注册
查看: 1734|回复: 9

[技术交流] python实现·十大排序算法之冒泡排序(Bubble Sort)

[复制链接]
发表于 2020-5-20 20:59:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 lb971216008 于 2020-7-10 16:51 编辑

有没有python学习的微信群,加我一个呗,我的vx:blingtu2020,加我备注拉我入群
python实现·十大排序算法之冒泡排序(Bubble Sort)简介

冒泡排序(Bubble Sort)是经典排序算法之一,属于交换排序的一种,基本的排序思路是:从头开始两两元素进行比较,大的元素就往上冒,这样遍历一轮后,最大的元素就会直接筛选出来。然后再重复上述操作,即可完成第二大元素的冒泡。以此类推,直到所有的元素排序完成。

算法实现步骤
  • 比较相邻的元素,如果第一个比第二个大,就交换它们两个(确定排序规则:从小到大或从大到小);
  • 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对;
  • 针对所有的元素重复以上的步骤,除了最后一个;
  • 重复步骤1~3,直到没有任何一对元素需要比较,那么排序完成。

Python 代码实现 # bubble_sort 代码实现
​
from typing import List
​
# 冒泡排序
def bubble_sort(arr: List[int]):
     """
     冒泡排序(Bubble sort)
     :param arr: 待排序的List,此处限制了排序类型为int
     :return: 冒泡排序是就地排序(in-place)
     """
     length = len(arr)
     if length <= 1:
         return
&#8203;
     for i in range(length):
         is_made_swap = False  ## 设置标志位,若本身已经有序,则直接break
         for j in range(length - i - 1):
             if arr[j] > arr[j + 1]:
                 arr[j], arr[j + 1] = arr[j + 1], arr[j]
                 is_made_swap = True
         if not is_made_swap:
             break # 测试数据
if __name__ == '__main__':
     import random
     random.seed(54)
     arr = [random.randint(0,100) for _ in range(10)]
     print("原始数据:", arr)
     bubble_sort(arr)
     print("冒泡排序结果:", arr) # 输出结果
原始数据: [17, 56, 71, 38, 61, 62, 48, 28, 57, 42]
冒泡排序结果: [17, 28, 38, 42, 48, 56, 57, 61, 62, 71]动画演示

                               
登录/注册后可看大图
算法分析
  • 时间复杂度
    如果数据一开始就是顺序,那么只需1趟排序即可完成。所需的比较次数C和记录移动次数M均达到最小值,即:



    所以,冒泡排序最好的时间复杂度为O(n)。
    如果数据一开始是逆序的,则需要进行n-1趟排序,每趟要进行n-i次比较,且每次比较必须移动记录3次来达到交换记录位置。此时,比较和移动次数均达到最大值:






  • 空间复杂度空间复杂度就是在交换元素时那个临时变量所占的内存空间。最优的空间复杂度就是开始元素顺序已经排好了,则空间复杂度为0;最差的空间复杂度就是开始元素逆序排序了,则空间复杂度为:O(n)&#8203;;平均的空间复杂度为:&#8203;O(1)&#8203;;
  • 稳定性
    由于在比较过程中,当两个相同大小的元素相邻,只比较大或者小,但不会交换位置。而当两个相等元素距离较远时,也只会把它们交换到相邻的位置。也就是说排序过程中,相等元素的位置前后关系不会发生任何变化,所以算法是稳定的。
  • 综合评价
    时间复杂度(平均)
    时间复杂度(最好)
    时间复杂度(最坏)
    空间复杂度
    排序方式
    稳定性

    &#8203;
    &#8203;
    &#8203;
    &#8203;
    in-place
    稳定

联系我们

个人博客网站:http://www.bling2.cn/

Github地址:https://github.com/lb971216008/Use-Python-to-Achieve

知乎专栏:https://zhuanlan.zhihu.com/Use-Python-to-Achieve

小专栏:https://xiaozhuanlan.com/Use-Python-to-Achieve

博客园:https://www.cnblogs.com/Use-Python-to-Achieve


                               
登录/注册后可看大图


冒泡排序动画演示

冒泡排序动画演示
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-20 21:04:34 | 显示全部楼层
一个鱼币,一次一个,每人限三次,神奇。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-20 21:09:16 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-5-20 21:04
一个鱼币,一次一个,每人限三次,神奇。

鱼C论坛怎么用Markdown,求助,弄过来全是乱码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-20 21:11:55 | 显示全部楼层
lb971216008 发表于 2020-5-20 21:09
鱼C论坛怎么用Markdown,求助,弄过来全是乱码

Markdown 还在测试,没有开放
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-20 21:18:45 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-5-20 21:11
Markdown 还在测试,没有开放

你是谁?机器人还是管理员?认识风介吗,我是来打广告的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-20 21:23:31 | 显示全部楼层
lb971216008 发表于 2020-5-20 21:18
你是谁?机器人还是管理员?认识风介吗,我是来打广告的

我是人。
风介?大概是之前的版主吧,不认识。
你告诉我你是打广告的,是想让我?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-21 11:33:32 | 显示全部楼层
很喜欢这个代码,继续补充算法的知识
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-23 13:12:01 | 显示全部楼层

回帖奖励 +1 鱼币

鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-23 13:50:07 From FishC Mobile | 显示全部楼层
WOW。我要鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-31 10:43:31 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 22:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表