python之冒泡排序改进
冒泡排序改进
关注公众号“轻松学编程”了解更多。
一、普通冒泡排序
[22,3,1,6,7,8,2,5]
普通冒泡排序
思路:
第一趟排序 从下标0开始,取出对应的值22
22和3比较,22 > 3 ,22和3交换,
交换后,22和1比较,22 > 1,22和1比较,
最后22会排到最后,
第一趟排序后列表变成
[3,1,6,7,8,2,5,22]
第二趟排序 从下标1开始,取出对应的值1
3和1比较,3 > 1 , 3和1交换,
以此类推,最后列表变成有序的了
[1,2,3,5,6,7,8,22]
这一整个过程就像一个水泡从低往上冒,
越往后水泡就越大(列表后面的元素会逐渐比前面的大)
def bubble_sort(alist):
for i in range(len(alist)):
# 跳过后面已经排好序的元素
for j in range(len(alist)-1-i):
if alist[j] > alist[j+1]:
alist[j],alist[j+1] = alist[j+1],alist[j]
return alist
def main():
print(bubble_sort([22, 3, 1, 6, 7, 8, 2, 5]))
if __name__ == '__main__':
main()
结果为:
[1, 2, 3, 5, 6, 7, 8, 22]
二、冒泡排序改进(搅拌排序)
考虑极端的情况:有以下列表[9,1,2,3,4,5,6,7,8],当把结果一趟排序后,9就会被排列表最后了,这时列表就已经是有序的了,这时就可以直接退出循环。
def bubble_sort(alist):
list_len = len(alist)
for i in range(list_len):
# 定义一个swapped
# 如果有元素交换过就置为True
# 如果没有元素交换过就退出循环
swapped = False
for j in range(list_len-1-i):
if alist[j] > alist[j+1]:
alist[j],alist[j+1] = alist[j+1],alist[j]
swapped = True
# 搅拌排序
# 从后面往前面检索,如果前面比后面的大,就交换
if swapped:
swapped = False
# 由于上面已经有一个元素在最后排好序了,所以这时要减2
for j in range(list_len - 2 - i,0,-1):
if alist[j] < alist[j - 1]:
alist[j], alist[j - 1] = alist[j - 1], alist[j]
swapped = True
# 如果没有发生元素交换,就说明列表已经是有序的了
# 这时可以直接退出循环
if not swapped:
return alist
def main():
print(bubble_sort([22, 3, 1, 6, 7, 8, 2, 5]))
print(bubble_sort([5, 1, 2, 3, ]))
print(bubble_sort([1, 2, 3, ]))
if __name__ == '__main__':
main()
结果为:
[1, 2, 3, 5, 6, 7, 8, 22]
[1, 2, 3, 5]
[1, 2, 3]
三、对象排序
1、重载大于号、小于号
class Student:
"""
学生类
"""
def __init__(self,name,age):
self.name = name
self.age = age
# 重载等于号
def __eq__(self, other):
return self.age == other.age
# 重载大于号
def __gt__(self, other):
return self.age > other.age
# 重载小于号
def __lt__(self, other):
return self.age < other.age
# 设置输出格式
def __repr__(self):
return f'{self.name}:{self.age}'
def bubble_sort(alist):
list_len = len(alist)
for i in range(list_len):
# 定义一个swapped
# 如果有元素交换过就置为True
# 如果没有元素交换过就退出循环
swapped = False
for j in range(list_len-1-i):
if alist[j] > alist[j+1]:
alist[j],alist[j+1] = alist[j+1],alist[j]
swapped = True
# 搅拌排序
# 从后面往前面检索,如果前面比后面的大,就交换
if swapped:
swapped = False
# 由于上面已经有一个元素在最后排好序了,所以这时要减2
for j in range(list_len - 2 - i,0,-1):
if alist[j] < alist[j - 1]:
alist[j], alist[j - 1] = alist[j - 1], alist[j]
swapped = True
# 如果没有发生元素交换,就说明列表已经是有序的了
# 这时可以直接退出循环
if not swapped:
return alist
def main():
s1 = Student('xiaoming',23)
s2 = Student('hong',20)
s3 = Student('da', 12)
# 对学生按年龄进行排序
print(bubble_sort([s1,s2,s3]))
if __name__ == '__main__':
main()
2、增加一个函数参数
Python中函数是“一等对象”。
函数可以赋值给变量。
函数可以作为函数的参数。
函数可以作为函数的返回值。
把函数设计成一等对象的语言也就是支持函数式编程的语言。
class Student:
"""
学生类
"""
def __init__(self,name,age):
self.name = name
self.age = age
# 设置输出格式
def __repr__(self):
return f'{self.name}:{self.age}'
# 可以使用":"来提示参数类型,"->"提示返回值类型,对函数没有影响
def bubble_sort(alist:list,comp=None) -> list:
'''
冒泡排序
:param alist: 要进行排序的列表
:param comp: 比较函数
:return: 排好序的列表
'''
list_len = len(alist)
for i in range(list_len):
swapped = False
for j in range(list_len-1-i):
# 如果传入了比较函数就使用比较函数
comp_result = comp(alist[j],alist[j+1]) > 0 if comp else alist[j] > alist[j+1]
if comp_result:
alist[j],alist[j+1] = alist[j+1],alist[j]
swapped = True
# 搅拌排序
# 从后面往前面检索,如果前面比后面的大,就交换
if swapped:
swapped = False
# 由于上面已经有一个元素在最后排好序了,所以这时要减2
for j in range(list_len - 2 - i,0,-1):
# 如果传入了比较函数就使用比较函数
comp_result = comp(alist[j], alist[j - 1]) < 0 if comp else alist[j] < alist[j - 1]
if comp_result:
alist[j], alist[j - 1] = alist[j - 1], alist[j]
swapped = True
# 如果没有发生元素交换,就说明列表已经是有序的了
# 这时可以直接退出循环
if not swapped:
return alist
def compare(s1,s2) -> int:
'''
比较两个学生对象(规则: 先比年龄, 年龄相同比名字)
:param s1: 待比较的第一个学生
:param s2: 待比较的第二个学生
:return: 如果s1小于等于s2返回负数;
如果s1大于s2返回正数;
'''
if s1.age == s2.age:
return -1 if s1.name <= s2.name else 1
else:
return -1 if s1.age <= s2.age else 1
def main():
s1 = Student('xiaoming',23)
s2 = Student('hong',20)
s3 = Student('lan', 12)
# 对学生按年龄进行排序
print(bubble_sort([s1,s2,s3],comp=compare))
list2 = ['grape', 'pitaya', 'pear', 'waxberry', 'apple']
# 一句话就能写完的函数可以直接使用Lambda函数(匿名函数)
# 根据字符串的长度给字符串排序
print(bubble_sort(list2, lambda s1, s2: len(s1) - len(s2)))
if __name__ == '__main__':
main()
结果为:
[lan:12, hong:20, xiaoming:23]
['pear', 'grape', 'apple', 'pitaya', 'waxberry']
后记
【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。
也可加我微信【1257309054】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!
公众号


关注我,我们一起成长~~
python之冒泡排序改进的更多相关文章
- python笔记--冒泡排序升级版
前言 面试的时候经常有面试官喜欢问如何进行冒泡排序?这个问题相信能难倒一批英雄好汉,本篇就详细讲解如何用python进行冒泡排序. 一.基本原理 1.概念: 冒泡排序(Bubble Sort),是一种 ...
- python与冒泡排序
上一篇文章,介绍了一个非常快的排序算法--桶排序,但是它的缺点就是太耗资源了,这次要实现的算法就不用太耗资源了,它就是冒泡排序. 问题提出: 将以下数据升序排列:9, 2, 8, 6, 4 冒泡排序原 ...
- python笔记-冒泡排序【转载】
本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/tag/python/ 前言 面试的时候经常有面试官喜欢问如何进行冒泡排序?这个问题相信能难倒一 ...
- 运用python实现冒泡排序算法
冒泡排序,一个经典的排序算法,因在算法运行中,极值会像水底的气泡一样逐渐冒出来,因此而得名. 冒泡排序的过程是比较两个相邻元素的大小,然后根据大小交换位置,这样从列表左端开始冒泡,最后最大值会依次从右 ...
- python实现冒泡排序和快速排序
冒泡排序和快排的python实现: data = [1, 3, 5, 10, 4, 7] times = 0 "冒泡排序" for i in range(len(data)): f ...
- python 排序冒泡排序与双向冒泡排序
冒泡排序: 冒泡排序就是每次找出最大(最小)元素,放在集合最前或最后,这是最简单的排序算法 def bubble_sort(collection): #升序排列 length=len(collecti ...
- python 实现冒泡排序与快速排序 遇到的错误与问题
今天看了兄弟连php里面的冒泡排序与快速排序,想了下应该可以用python实现. 冒泡排序函数: def mysort(x): len1 = len(x) for i in range(len1-1, ...
- python 算法 -- 冒泡排序
python 排序算法 -- 冒泡排序 原理 从数组的底部开始, 两两比较大小, 小的在下,大的在上, 依次类推直到顶部. 当整个数组比较完毕, 则最上面的一定是最大值(此即冒泡的由来); 当第一轮比 ...
- Python版冒泡排序算法
0 为什么写本文 一方面对经典排序算法冒泡排序进行复习,另一方面通过实际应用来检验python基础知识的掌握情况,包括range函数.len函数.for循环.if语句.函数定义与调用.列表的排序等知识 ...
随机推荐
- spring多模块之间的调用
https://blog.csdn.net/tomcat_2014/article/details/50206197?locationNum=5
- 记一次数据库主从导致严重的bug解决过程
1.事情起始: 我们每个月要给商家进行出账,所以有定时任务去跑商家的订单和售后进行出账,这个功能已经上线很久了,代码执行多次都没问题,突然有一天,产品找我说出现bug了: 这时,去生产库查询重复的订单 ...
- Centos-修改密码-passwd
passwd 更新用户验证令牌,root用户可以修改任意用户密码,但普通用户只能修改自己的密码 相关参数 -l 禁止用户使用密码验证登录,但可以使用ssh-key登录 -u 启动用户密码验证登录 ...
- 决策树防止过拟合(预剪枝(Pre-Pruning))
预剪枝(Pre-Pruning):预剪枝就是在构造决策树的过程中,先对每个结点在划分前进行估计,若果当前结点的划分不能带来决策树模型泛华性能的提升,则不对当前结点进行划分并且将当前结点标记为叶结点.
- 011 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 05 变量的三个元素的详细介绍之三—— 变量值——即Java中的“字面值”
011 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 05 变量的三个元素的详细介绍之三-- 变量值--即Java中的"字面值" 变量值可以是 ...
- Ubuntu18.04修改apt-get源
1)备份源文件: sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 2)查看版本信息 如是Linux Mint等Ubuntu衍生版,执行: ...
- linux查看进程内存使用情况,以及将线程情况输出文件
用jmap把进程内存使用情况dump到文件中,再用jhat分析查看.jmap进行dump命令格式如下: jmap -dump:format=b,file=/tmp/dump.dat 21711 -- ...
- shell-逻辑操作符讲解与文件条件测试多范例多生产案例
1. 逻辑操作符 在书写测试表达式时,可以使用表1.1中的逻辑操作符实现复杂的条件测试 表1.1逻辑连接符 提示: ! 中文意思是反:与一个逻辑值相反的逻辑值 -a 中文意思是与(and & ...
- 推荐一款IDEA神器!一键查看Java字节码以及其他类信息
由于后面要分享的一篇文章中用到了这篇文章要推荐的一个插件,所以这里分享一下.非常实用!你会爱上它的! 开始推荐 IDEA 字节码查看神器之前,先来回顾一下 Java 字节码是啥. 何为 Java 字节 ...
- redis 各种数据结构的encoding实现
redis 各种数据结构的encoding实现 Redis type命令实际返回的就是当前键的数据结构类型,它们分别是:string(字符串).hash(哈希).list(列表).set(集合).zs ...