• 排序算法之冒泡排序


    一、思路

      对一个序列中的元素,比较相邻的元素。如果第一个比第二个大,就交换它们两个,将大的元素放在右边,此时右边就称为有序区,左边就是无序区,不断重复的对左边区域相邻元素进行比较,右边有序区的元素不断增加,最后完成排序。

    具体看下面的例子:

    • 游标刚开始在第一个的位置,那么就会比较3和5的值,3没有5大,不换位置
    • 游标移动到第二个的位置,比较5和2,5比2大,更换位置,如图右
    • 游标移动到第三个位置,比较5和9,不换位置

    这样循环一次叫做一趟(游标不移动到最后一个位置,也就是第四个位置),最后的结果就是选出最大的值在右侧,右侧也就是有序区,然后再进行第二趟、第三趟。

    二、实现

    ###range最右侧不取
    def bubble_sort(l):
    
        for i in range(len(l)-1): #循环的是趟数 i表示趟数
            for j in range(len(l)-i-1): #循环的是游标 j表示的是游标
                if l[j]>l[j+1]:
                    l[j+1],l[j]=l[j],l[j+1] #调换顺序
    l=[3,5,2,9]
    bubble_sort(l)
    print(l) #[2, 3, 5, 9]

    分析:

      i和j都是从0开始取值,当进行第0趟时,j的取值是2,但是使用的range函数,所以右侧取不到,j的范围是(0,3),当进行第1趟时,j的返回是(0,2),一共可以进行(序列的长度-1)趟。

    注意:

    • 一共循环多少趟
    • 无序区在左侧
    • 游标的最大取值是无序区的倒数第二个值

    三、优化

      如果冒泡排序中执行一趟而没有进行交换,则序列已经是有序的,可以直接结束算法。

    ###range最右侧不取
    def bubble_sort(l):
    
        for i in range(len(l)-1): #循环的是趟数 i表示趟数
            exchange=False
            for j in range(len(l)-i-1): #循环的是游标 j表示的是游标
                if l[j]>l[j+1]:
                    l[j+1],l[j]=l[j],l[j+1] #调换顺序
                    exchange=True
            if not exchange:
                return 
    l=[3,5,2,9]
    bubble_sort(l)
    print(l) #[2, 3, 5, 9]
  • 相关阅读:
    Visual Studio 出现生成错误 ,要继续并运行上次的成功生成吗?
    postgresql迁mysql之后兼容性问题
    Java中把十进制转为二进制(判断有效的ip地址和掩码)
    Java中如何把整数变为二进制输出
    Java二进制与十进制转换及位运算
    面试知识点总结之开放性问题
    面试知识点总结之常用设计模式
    linux下VIRT,RES,SHR的含义
    JSP JS 日期控件的下载、使用及注意事项
    Html5实现头像上传和编辑,保存为Base64的图片过程
  • 原文地址:https://www.cnblogs.com/shenjianping/p/11068388.html
Copyright © 2020-2023  润新知