关于排序,真的非常的重要。数据可以从小到大排序,也可以从大到小排序。这样对于一个有序的数据,我们处理起来就很方便,这对于我们的工作帮助是很大的。

那么你拿到一组无序的数据,你将要如何去处理它呢?

冒泡排序就是从一个可迭代容器里,用某一索引去和它的下一个索引做比较,如果大于它的下一个索引,它们就交换位置。反正就是通过交换,使得大的数据在小的数据后面,使得数据的顺序满足从小到大的顺序。

我查阅资料的解释是这样的:

冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢""到数列的顶端。

直观一点的解释就是:

如果我们想要得到一个正序的列表。开始的时候,0索引的数据和1索引的数据比较,显然3小于4,那么就不交换。然后比较1索引的数据和2索引的数据。4大于2,所以交换:

之后,2索引的数据和3索引的数据比较,4大于1则交换。那么4就到了正确的位置上,我们重复以上的操作,0索引的数据和1索引的数据比较……经过这个操作3就到了正确的位置上。我们发现每次从0索引比较过去,就会有一个数据落在正确的位置上。

我的容器里面有4个数据,那我们是不是循环四次,从索引比较过去就能把所有的数据落在正确的位置。其实只需要三次循环就行,4个数据里,其他3个数据都落在正确的位置,那么最后一个数据一定也是在正确的位置上,是不需要额外加一次循环排序的。

我们再理一下思路:

如果有n个数据,我们循环n-1次,每次循环都从0索引到2索引交换排序。

我们进行的编程的时候也要进行循环的嵌套。

具体的代码:

for i in range(len(li)-1):  #  n个数据循环n-1次
for j in range(len(li)-1-i): # 0索引到2索引
if li[j] > li[j + 1]: # 比较数的大小后交换
li[j], li[j + 1] = li[j + 1], li[j]

被嵌套的那个循环里面是len(li)-1-i,这个意思是:后面已经落到正确位置的数据是不需要再进行判断然后排序的。i是外部循环的元素,i是几就代表有几个数据已经落到了正确的位置。这样应该就能很好的理解len(li)-1-i了吧。

如果代码像上面那样写并不是完美的,例如这样一组数据:

除了第一个数据,后面的数据已经是排好的。我们进行一次从0索引到2索引的交换就可以完成数据的排序。但是如果按上面代码的写法,就必须要循环三次,也就是后面的两次循环虽然进行了,但是并没有实际作用,是多余的。那么如何优化代码呢?

其实很简单,每进行一次外循环,我们把一个exchange变量赋予False值。每一次内循环比较条件成立,就把exchange变量改成True。然后我们加一行判断条件,如果not exchange为True就return结束循环。

def buble_sort(li):
for i in range(len(li)-1): # n个数循环n-1次
exchange = False
for j in range(len(li)-1-i):
if li[j] > li[j + 1]: # 比较数的大小后交换
li[j], li[j + 1] = li[j + 1], li[j]
exchange = True
if not exchange:
return

如果没弄明白,多看几遍,自己理一下思路就差不多了。

python:冒泡排序(Bubble Sort)超详细教程!的更多相关文章

  1. 【python】10分钟教你用python打造贪吃蛇超详细教程

    10分钟教你用python打造贪吃蛇超详细教程 在家闲着没妹子约, 刚好最近又学了一下python,听说pygame挺好玩的.今天就在家研究一下, 弄了个贪吃蛇出来.希望大家喜欢. 先看程序效果: 0 ...

  2. Python自动抢红包,超详细教程,再也不会错过微信红包了!

    目录: 0 引言 1 环境 2 需求分析 3 前置准备 4 抢红包流程回顾 5 代码梳理 6 后记 0 引言 提到抢红包,就不得不提Xposed框架,它简直是个抢红包的神器,但使用Xposed框架有一 ...

  3. NumPy 超详细教程(3):ndarray 的内部机理及高级迭代

    系列文章地址 NumPy 最详细教程(1):NumPy 数组 NumPy 超详细教程(2):数据类型 NumPy 超详细教程(3):ndarray 的内部机理及高级迭代 ndarray 对象的内部机理 ...

  4. NumPy 超详细教程(2):数据类型

    系列文章地址 NumPy 最详细教程(1):NumPy 数组 NumPy 超详细教程(2):数据类型 NumPy 超详细教程(3):ndarray 的内部机理及高级迭代 文章目录 NumPy 数据类型 ...

  5. NumPy 超详细教程(1):NumPy 数组

    系列文章地址 NumPy 最详细教程(1):NumPy 数组 NumPy 超详细教程(2):数据类型 NumPy 超详细教程(3):ndarray 的内部机理及高级迭代 文章目录 Numpy 数组:n ...

  6. 数学规划求解器lp_solve超详细教程

    前言 最近小编学了运筹学中的单纯形法.于是,很快便按奈不住跳动的心.这不得不让我拿起纸和笔思考着,一个至关重要的问题:如何用单纯形法装一个完备的13? 恰巧,在我坐在图书馆陷入沉思的时候,一位漂亮的小 ...

  7. c++ 网络编程(九)LINUX/windows-IOCP模型 多线程超详细教程及多线程实现服务端

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9661012.html 先讲Linux下(windows下在后面可以直接跳到后面看): 一.线程 ...

  8. Java中的经典算法之冒泡排序(Bubble Sort)

    Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...

  9. Github上传代码菜鸟超详细教程【转】

    最近需要将课设代码上传到Github上,之前只是用来fork别人的代码. 这篇文章写得是windows下的使用方法. 第一步:创建Github新账户 第二步:新建仓库 第三部:填写名称,简介(可选), ...

  10. WebRTC VideoEngine超详细教程(三)——集成X264编码和ffmpeg解码

    转自:http://blog.csdn.net/nonmarking/article/details/47958395 本系列目前共三篇文章,后续还会更新 WebRTC VideoEngine超详细教 ...

随机推荐

  1. Javaheima13

    Java Stream流 salary 薪水 bonus 奖金 top performer 优秀员工 punish 处罚 1员工信息至少包含了(名称.性别.工资.奖金.处罚记录) 2开发一部有4个员工 ...

  2. spring java枚举转json 方便前端取值

    未处理前: "gender":"GenderEnum.FEMALE(code=2, gender=女)" 解决方法:使用jackson提供的注解 @JsonFo ...

  3. 【内存管理】ION内存管理器浅析(system heap)(基于linux 4.14)

    什么是ION ION具体不知道是什么的缩写,只知道是android系统上google引入的内存管理方式,为了实现用户与内核间数据共享时零拷贝.多用于多媒体,比如camera和display,graph ...

  4. YY播放器源码解析

    YY播放器使用Flutter编写的一个聚合播放器, 起因是看了 ZY-Player的源码, 发现实现挺有意思的, 也比较简单 地址: https://github.com/waifu-project/ ...

  5. springboot使用MD5加密

    (11条消息) SpringBoot项目-密码MD5加密_springboot md5加密_wdfxfff的博客-CSDN博客 (11条消息) 创建MD5工具类_md5依赖_天天喝旺仔的博客-CSDN ...

  6. 网络基础-分层思想和TCP/TP协议族

    一 .分层思想 首先,什么是分层?1984年国际标准化组织(iso)颁布了开放系统互联(osi)参考模型:一个开放式体系结构,将网络分成七层. 分层 功能 应用层 网络服务与最终用户的一个接口 表示层 ...

  7. ElseViewer--校稿

    1Edit ModeThis presents the proof in continuous scroll to review and make corrections. By default, y ...

  8. 关于 Android sdk manager 的安装问题

    最近刚刚接触小程序测试,故此需要搭建环境 我用的是python3.6+appium1.8.2+Android sdk manager 关于应用程序,大家有需要的话,可以找我要. 1.关于安装Andro ...

  9. SpringBoot使用OkHttp

    参考文章: https://www.cnblogs.com/hongdada/p/9259965.html https://blog.csdn.net/qq_41890954/article/deta ...

  10. 53.cin、cin.get()、cin.getline()、getline()、gets()等函数的用法

    1.cin 用法1:最基本,也是最常用的用法,输入一个数字: #pragma warning(disable:4996) #define _CRT_SECURE_NO_WARNINGS 1 #incl ...