zoukankan      html  css  js  c++  java
  • Python冒泡排序算法及其优化

    冒泡排序

    所谓冒泡,就是将元素两两之间进行比较,谁大就往后移动,直到将最大的元素排到最后面,接着再循环一趟,从头开始进行两两比较,而上一趟已经排好的那个元素就不用进行比较了。(图中排好序的元素标记为黄色柱子)

    冒泡排序动图演示

     

    上python代码:

     1 def bubble_sort(items):
     2     for i in range(len(items) - 1):
     3         for j in range(len(items) - 1 - i):
     4             if items[j] > items[j + 1]:
     5                 items[j], items[j + 1] = items[j + 1], items[j]
     6     return items
     7  
     8  
     9 list1 = [2,1,9,11,10,8,7]
    10 print(bubble_sort(list1))

    输出结果:

    1 [1, 2, 7, 8, 9, 10, 11]

    这是冒泡排序最普通的写法,但你会发现它有一些不足之处,比如列表:[1,2,3,4,7,5,6],第一次循环将最大的数排到最后,此时列表已经都排好序了,就是不用再进行第二次、第三次...

    冒泡排序优化一:

    设定一个变量为False,如果元素之间交换了位置,将变量重新赋值为True,最后再判断,在一次循环结束后,变量如果还是为False,则brak退出循环,结束排序。

     1 def bubble_sort(items):
     2     for i in range(len(items) - 1):
     3         flag = False
     4         for j in range(len(items) - 1 - i):
     5             if items[j] > items[j + 1]:
     6                 items[j], items[j + 1] = items[j + 1], items[j]
     7                 flag = True
     8         if not flag:
     9             break
    10     return items

    冒泡排序优化二:搅拌排序 / 鸡尾酒排序

    上面这种写法还有一个问题,就是每次都是从左边到右边进行比较,这样效率不高,你要考虑当最大值和最小值分别在两端的情况。写成双向排序提高效率,即当一次从左向右的排序比较结束后,立马从右向左来一次排序比较。

    双向排序动图演示
     

     python代码:

     1 def bubble_sort(items):
     2     for i in range(len(items) - 1):
     3         flag = False
     4         for j in range(len(items) - 1 - i):
     5             if items[j] > items[j + 1]:
     6                 items[j], items[j + 1] = items[j + 1], items[j]
     7                 flag = True
     8         if flag:
     9             flag = False
    10             for j in range(len(items) - 2 - i, 0, -1):
    11                 if items[j - 1] > items[j]:
    12                     items[j], items[j - 1] = items[j - 1], items[j]
    13                     flag = True
    14         if not flag:
    15             break
    16     return items

    冒泡排序优化三:

    最后要考虑的情况就是,如果给你的不是列表,而是对象,或者列表里面都是字符串,那么上述的代码也就没有用了,这时候你就要自定义函数了,并将其当成参数传入bubble_sort函数

    python代码:

    def bubble_sort(items, comp=lambda x, y: x > y):
        for i in range(len(items) - 1):
            flag = False
            for j in range(len(items) - 1 - i):
                if comp(items[j],items[j + 1]):
                    items[j], items[j + 1] = items[j + 1], items[j]
                    flag = True
            if flag:
                flag = False
                for j in range(len(items) - 2 - i, 0, -1):
                    if comp(items[j - 1],items[j]):
                        items[j], items[j - 1] = items[j - 1], items[j]
                        flag = True
            if not flag:
                break
        return items
     
    list2 = ['apple', 'watermelon', 'pitaya', 'waxberry', 'pear']
    print(bubble_sort(list2,lambda s1,s2: len(s1) > len(s2)))  #按照字符串长度从小到大来排序

    输出结果:

    1 ['pear', 'apple', 'pitaya', 'waxberry', 'watermelon']

    类似的,当有人叫你给一个类对象排序时,也可以传入lambda 自定义函数。

     1 class Student():
     2     """学生"""
     3  
     4     def __init__(self, name, age):
     5         self.name = name
     6         self.age = age
     7  
     8     def __repr__(self):
     9         return f'{self.name}: {self.age}'
    10  
    11 items1 = [
    12         Student('Wang Dachui', 25),
    13         Student('Di ren jie', 38),
    14         Student('Zhang Sanfeng', 120),
    15         Student('Bai yuanfang', 18)
    16     ]
    17  
    18 print(bubble_sort(items1, lambda s1, s2: s1.age > s2.age))

    输出结果:按照年龄从小到大排序

    1 [Bai yuanfang: 18, Wang Dachui: 25, Di ren jie: 38, Zhang Sanfeng: 120]

    以上就是关于冒泡排序的原理,以及一些优化写法,希望会对你有所帮助。

     

     

  • 相关阅读:
    ORA-39126 KUPW$WORKER.PUT_DDLS [TABLE_STATISTICS]中Worker发生意外致命错误
    C# 9 新特性 —— 增强的 foreach
    在 xunit 测试项目中使用依赖注入
    gitee.com 码农中添加私有仓库并通过ssh链接
    强化学习 —— reinforce算法中更新一次策略网络时episodes个数的设置对算法性能的影响 —— reinforce算法中迭代训练一次神经网络时batch_size大小的不同设置对算法性能的影响
    如何在 Ubuntu18.04 server 服务器版本的操作系统下 配置IP
    东北某海滨城市的某高校的某分校区的校园网登录程序,(python3, 模拟浏览器的登入方式)
    强化学习中经典算法 —— reinforce算法 —— (进一步理解, 理论推导出的计算模型和实际应用中的计算模型的区别)
    【转载】 Linux 设置CPU Performance模式
    深度学习中使用TensorFlow或Pytorch框架时到底是应该使用CPU还是GPU来进行运算???
  • 原文地址:https://www.cnblogs.com/chenshengkai/p/11418553.html
Copyright © 2011-2022 走看看