冒泡排序改进

关注公众号“轻松学编程”了解更多。

一、普通冒泡排序

  1. [22,3,1,6,7,8,2,5]
  2. 普通冒泡排序
  3. 思路:
  4. 第一趟排序 从下标0开始,取出对应的值22
  5. 223比较,22 > 3 ,223交换,
  6. 交换后,221比较,22 > 1,221比较,
  7. 最后22会排到最后,
  8. 第一趟排序后列表变成
  9. [3,1,6,7,8,2,522]
  10. 第二趟排序 从下标1开始,取出对应的值1
  11. 31比较,3 > 1 , 31交换,
  12. 以此类推,最后列表变成有序的了
  13. [1,2,3,5,6,7,8,22]
  14. 这一整个过程就像一个水泡从低往上冒,
  15. 越往后水泡就越大(列表后面的元素会逐渐比前面的大)
  1. def bubble_sort(alist):
  2. for i in range(len(alist)):
  3. # 跳过后面已经排好序的元素
  4. for j in range(len(alist)-1-i):
  5. if alist[j] > alist[j+1]:
  6. alist[j],alist[j+1] = alist[j+1],alist[j]
  7. return alist
  8. def main():
  9. print(bubble_sort([22, 3, 1, 6, 7, 8, 2, 5]))
  10. if __name__ == '__main__':
  11. main()
  1. 结果为:
  2. [1, 2, 3, 5, 6, 7, 8, 22]

二、冒泡排序改进(搅拌排序)

考虑极端的情况:有以下列表[9,1,2,3,4,5,6,7,8],当把结果一趟排序后,9就会被排列表最后了,这时列表就已经是有序的了,这时就可以直接退出循环。


  1. def bubble_sort(alist):
  2. list_len = len(alist)
  3. for i in range(list_len):
  4. # 定义一个swapped
  5. # 如果有元素交换过就置为True
  6. # 如果没有元素交换过就退出循环
  7. swapped = False
  8. for j in range(list_len-1-i):
  9. if alist[j] > alist[j+1]:
  10. alist[j],alist[j+1] = alist[j+1],alist[j]
  11. swapped = True
  12. # 搅拌排序
  13. # 从后面往前面检索,如果前面比后面的大,就交换
  14. if swapped:
  15. swapped = False
  16. # 由于上面已经有一个元素在最后排好序了,所以这时要减2
  17. for j in range(list_len - 2 - i,0,-1):
  18. if alist[j] < alist[j - 1]:
  19. alist[j], alist[j - 1] = alist[j - 1], alist[j]
  20. swapped = True
  21. # 如果没有发生元素交换,就说明列表已经是有序的了
  22. # 这时可以直接退出循环
  23. if not swapped:
  24. return alist
  25. def main():
  26. print(bubble_sort([22, 3, 1, 6, 7, 8, 2, 5]))
  27. print(bubble_sort([5, 1, 2, 3, ]))
  28. print(bubble_sort([1, 2, 3, ]))
  29. if __name__ == '__main__':
  30. main()
  1. 结果为:
  2. [1, 2, 3, 5, 6, 7, 8, 22]
  3. [1, 2, 3, 5]
  4. [1, 2, 3]

三、对象排序

1、重载大于号、小于号

  1. class Student:
  2. """
  3. 学生类
  4. """
  5. def __init__(self,name,age):
  6. self.name = name
  7. self.age = age
  8. # 重载等于号
  9. def __eq__(self, other):
  10. return self.age == other.age
  11. # 重载大于号
  12. def __gt__(self, other):
  13. return self.age > other.age
  14. # 重载小于号
  15. def __lt__(self, other):
  16. return self.age < other.age
  17. # 设置输出格式
  18. def __repr__(self):
  19. return f'{self.name}:{self.age}'
  20. def bubble_sort(alist):
  21. list_len = len(alist)
  22. for i in range(list_len):
  23. # 定义一个swapped
  24. # 如果有元素交换过就置为True
  25. # 如果没有元素交换过就退出循环
  26. swapped = False
  27. for j in range(list_len-1-i):
  28. if alist[j] > alist[j+1]:
  29. alist[j],alist[j+1] = alist[j+1],alist[j]
  30. swapped = True
  31. # 搅拌排序
  32. # 从后面往前面检索,如果前面比后面的大,就交换
  33. if swapped:
  34. swapped = False
  35. # 由于上面已经有一个元素在最后排好序了,所以这时要减2
  36. for j in range(list_len - 2 - i,0,-1):
  37. if alist[j] < alist[j - 1]:
  38. alist[j], alist[j - 1] = alist[j - 1], alist[j]
  39. swapped = True
  40. # 如果没有发生元素交换,就说明列表已经是有序的了
  41. # 这时可以直接退出循环
  42. if not swapped:
  43. return alist
  44. def main():
  45. s1 = Student('xiaoming',23)
  46. s2 = Student('hong',20)
  47. s3 = Student('da', 12)
  48. # 对学生按年龄进行排序
  49. print(bubble_sort([s1,s2,s3]))
  50. if __name__ == '__main__':
  51. main()

2、增加一个函数参数

Python中函数是“一等对象”。

函数可以赋值给变量。

函数可以作为函数的参数。

函数可以作为函数的返回值。

把函数设计成一等对象的语言也就是支持函数式编程的语言。

  1. class Student:
  2. """
  3. 学生类
  4. """
  5. def __init__(self,name,age):
  6. self.name = name
  7. self.age = age
  8. # 设置输出格式
  9. def __repr__(self):
  10. return f'{self.name}:{self.age}'
  11. # 可以使用":"来提示参数类型,"->"提示返回值类型,对函数没有影响
  12. def bubble_sort(alist:list,comp=None) -> list:
  13. '''
  14. 冒泡排序
  15. :param alist: 要进行排序的列表
  16. :param comp: 比较函数
  17. :return: 排好序的列表
  18. '''
  19. list_len = len(alist)
  20. for i in range(list_len):
  21. swapped = False
  22. for j in range(list_len-1-i):
  23. # 如果传入了比较函数就使用比较函数
  24. comp_result = comp(alist[j],alist[j+1]) > 0 if comp else alist[j] > alist[j+1]
  25. if comp_result:
  26. alist[j],alist[j+1] = alist[j+1],alist[j]
  27. swapped = True
  28. # 搅拌排序
  29. # 从后面往前面检索,如果前面比后面的大,就交换
  30. if swapped:
  31. swapped = False
  32. # 由于上面已经有一个元素在最后排好序了,所以这时要减2
  33. for j in range(list_len - 2 - i,0,-1):
  34. # 如果传入了比较函数就使用比较函数
  35. comp_result = comp(alist[j], alist[j - 1]) < 0 if comp else alist[j] < alist[j - 1]
  36. if comp_result:
  37. alist[j], alist[j - 1] = alist[j - 1], alist[j]
  38. swapped = True
  39. # 如果没有发生元素交换,就说明列表已经是有序的了
  40. # 这时可以直接退出循环
  41. if not swapped:
  42. return alist
  43. def compare(s1,s2) -> int:
  44. '''
  45. 比较两个学生对象(规则: 先比年龄, 年龄相同比名字)
  46. :param s1: 待比较的第一个学生
  47. :param s2: 待比较的第二个学生
  48. :return: 如果s1小于等于s2返回负数;
  49. 如果s1大于s2返回正数;
  50. '''
  51. if s1.age == s2.age:
  52. return -1 if s1.name <= s2.name else 1
  53. else:
  54. return -1 if s1.age <= s2.age else 1
  55. def main():
  56. s1 = Student('xiaoming',23)
  57. s2 = Student('hong',20)
  58. s3 = Student('lan', 12)
  59. # 对学生按年龄进行排序
  60. print(bubble_sort([s1,s2,s3],comp=compare))
  61. list2 = ['grape', 'pitaya', 'pear', 'waxberry', 'apple']
  62. # 一句话就能写完的函数可以直接使用Lambda函数(匿名函数)
  63. # 根据字符串的长度给字符串排序
  64. print(bubble_sort(list2, lambda s1, s2: len(s1) - len(s2)))
  65. if __name__ == '__main__':
  66. main()
  1. 结果为:
  2. [lan:12, hong:20, xiaoming:23]
  3. ['pear', 'grape', 'apple', 'pitaya', 'waxberry']

后记

【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。

也可加我微信【1257309054】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!

公众号

关注我,我们一起成长~~

python之冒泡排序改进的更多相关文章

  1. python笔记--冒泡排序升级版

    前言 面试的时候经常有面试官喜欢问如何进行冒泡排序?这个问题相信能难倒一批英雄好汉,本篇就详细讲解如何用python进行冒泡排序. 一.基本原理 1.概念: 冒泡排序(Bubble Sort),是一种 ...

  2. python与冒泡排序

    上一篇文章,介绍了一个非常快的排序算法--桶排序,但是它的缺点就是太耗资源了,这次要实现的算法就不用太耗资源了,它就是冒泡排序. 问题提出: 将以下数据升序排列:9, 2, 8, 6, 4 冒泡排序原 ...

  3. python笔记-冒泡排序【转载】

    本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/tag/python/ 前言 面试的时候经常有面试官喜欢问如何进行冒泡排序?这个问题相信能难倒一 ...

  4. 运用python实现冒泡排序算法

    冒泡排序,一个经典的排序算法,因在算法运行中,极值会像水底的气泡一样逐渐冒出来,因此而得名. 冒泡排序的过程是比较两个相邻元素的大小,然后根据大小交换位置,这样从列表左端开始冒泡,最后最大值会依次从右 ...

  5. python实现冒泡排序和快速排序

    冒泡排序和快排的python实现: data = [1, 3, 5, 10, 4, 7] times = 0 "冒泡排序" for i in range(len(data)): f ...

  6. python 排序冒泡排序与双向冒泡排序

    冒泡排序: 冒泡排序就是每次找出最大(最小)元素,放在集合最前或最后,这是最简单的排序算法 def bubble_sort(collection): #升序排列 length=len(collecti ...

  7. python 实现冒泡排序与快速排序 遇到的错误与问题

    今天看了兄弟连php里面的冒泡排序与快速排序,想了下应该可以用python实现. 冒泡排序函数: def mysort(x): len1 = len(x) for i in range(len1-1, ...

  8. python 算法 -- 冒泡排序

    python 排序算法 -- 冒泡排序 原理 从数组的底部开始, 两两比较大小, 小的在下,大的在上, 依次类推直到顶部. 当整个数组比较完毕, 则最上面的一定是最大值(此即冒泡的由来); 当第一轮比 ...

  9. Python版冒泡排序算法

    0 为什么写本文 一方面对经典排序算法冒泡排序进行复习,另一方面通过实际应用来检验python基础知识的掌握情况,包括range函数.len函数.for循环.if语句.函数定义与调用.列表的排序等知识 ...

随机推荐

  1. Centos-rpm二进制包安装-rpm

    rpm 软件包管理器 rpm包命名规范 mysql-community-server-5.7.21-1.el7.x86_64.rpm 软件名称 mysql-community-server 软件版本 ...

  2. Linux安装软件方法总结

    相比于windows系统,Linux安装程序就比较复杂了,很多需要root用户才能安装.常见的有以下几种安装方法 源码安装 rpm包安装 yum安装 (RedHat.CentOS) apt-get安装 ...

  3. 未能找到元素“appender”的架构信息

    在App.config写入log4net的配置信息,然后错误列表就出现了一堆的消息提示. 未能找到元素"appender-ref"的架构信息 未能找到元素"appende ...

  4. Matlab 中 imshow 函数

    转自: https://blog.csdn.net/xiaochou87/article/details/43488829 matlab中显示图像的语句是:                       ...

  5. matlab receive License Manager Error -103?

    参考:https://www.mathworks.com/matlabcentral/answers/91874-why-do-i-receive-license-manager-error-103 ...

  6. Matlab中加汉明窗 ahmming 作用

    转自:http://www.cnblogs.com/lxy2017/p/4049124.html 1.什么是汉明窗? 语音信号一般在10ms到30ms之间,我们可以把它看成是平稳的.为了处理语音信号, ...

  7. SPI应用 用SPI总线读取气压传感器SCP1000的数据

    Using SPI to read a Barometric Pressure Sensor This example shows how to use the SPI (Serial Periphe ...

  8. 配置DVWA漏洞环境

    web萌新,因为在别人的环境上练习总有点不舒服,所以在本地搭建了网站:下面记录一下搭建的步骤 DVWA:是一个漏洞环境包,可以用phpstudy或者wamp解析:所以要想配置这个环境,就必须有这两个软 ...

  9. golang RSA2加密/解密

    $go get github.com/wenzhenxi/gorsa test.go文件的内容 运行: $go run test.go package main import ( "fmt& ...

  10. 一文看懂Vue3.0的优化

    1.源码优化: a.使用monorepo来管理源码 Vue.js 2.x 的源码托管在 src 目录,然后依据功能拆分出了 compiler(模板编译的相关代码).core(与平台无关的通用运行时代码 ...