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

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

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

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

冒泡排序(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. CF1422

    CF1422 那个博客搭好遥遥无期. A: 看代码就行. #include<bits/stdc++.h> using namespace std; void work() { int a, ...

  2. 记安装MySQL数据库

    记录一次自己动手安装MySQL数据库所踩的坑   MySQL安装包与操作系统匹配 安装包有amd和Intel,32位.64位多种组合需要确认仔细使用者操作系统和CPU型号 例如我使用的是CentOS ...

  3. Ensemble learning A survey 论文阅读

    Ensemble learning A survey是2018年发表的一篇关于集成学习的综述性论文 发展 在Surowiecki的书中The Wisdom of Crowds,当符合以下标准时,大众的 ...

  4. Manage your references to .Net assemblies Dynamics 365 for Operations VS projects

    (Dynamics 365 for Operations was previously known as the New Dynamics AX) Dynamics 365 for Operation ...

  5. Servlet's characters of get and post

    Tomcat默认是使用ISO8859-1来解码的,ISO8859-1是不支持中文的. 1.post请求解决乱码原因: 服务器不知道按哪种编码来处理HTML等文件来响应给浏览器的,所以处理post请求时 ...

  6. Json对象转换模块(自编代码JsonObject.cs)

    namespace 信息采集系统.Common { /// <summary> /// Json类型对象,用于其它Json对象继承 /// </summary> /// < ...

  7. [Lua]敏感字检测

    参考链接: https://zhuanlan.zhihu.com/p/84685657 https://www.cnblogs.com/luguoshuai/p/9254190.html 一开始打算使 ...

  8. swiper常见问题、动态加载数据问题

    swiper加载静态文件是没有问题的 swiper加载动态文件需要在请求后再加载这个函数 参考链接:  https://blog.csdn.net/webzrh/article/details/781 ...

  9. Centos7安装nodejs(npm)

    执行命令: 设置yum安装源> curl --silent --location https://rpm.nodesource.com/setup_14.x | sudo bash (14是大的 ...

  10. react hooks(useState、useEffect、useRef详解)

    好巧不巧,工作了一年跳槽了,之前用的vue,现在用的react- 嗯!工作使人进步!现在开始学react吧! 切入正题- react hooks是React16.8.0之后出现的, 类组件存在的问题: ...