python:冒泡排序(Bubble Sort)超详细教程!
关于排序,真的非常的重要。数据可以从小到大排序,也可以从大到小排序。这样对于一个有序的数据,我们处理起来就很方便,这对于我们的工作帮助是很大的。
那么你拿到一组无序的数据,你将要如何去处理它呢?
冒泡排序就是从一个可迭代容器里,用某一索引去和它的下一个索引做比较,如果大于它的下一个索引,它们就交换位置。反正就是通过交换,使得大的数据在小的数据后面,使得数据的顺序满足从小到大的顺序。
我查阅资料的解释是这样的:
冒泡排序(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)超详细教程!的更多相关文章
- 【python】10分钟教你用python打造贪吃蛇超详细教程
10分钟教你用python打造贪吃蛇超详细教程 在家闲着没妹子约, 刚好最近又学了一下python,听说pygame挺好玩的.今天就在家研究一下, 弄了个贪吃蛇出来.希望大家喜欢. 先看程序效果: 0 ...
- Python自动抢红包,超详细教程,再也不会错过微信红包了!
目录: 0 引言 1 环境 2 需求分析 3 前置准备 4 抢红包流程回顾 5 代码梳理 6 后记 0 引言 提到抢红包,就不得不提Xposed框架,它简直是个抢红包的神器,但使用Xposed框架有一 ...
- NumPy 超详细教程(3):ndarray 的内部机理及高级迭代
系列文章地址 NumPy 最详细教程(1):NumPy 数组 NumPy 超详细教程(2):数据类型 NumPy 超详细教程(3):ndarray 的内部机理及高级迭代 ndarray 对象的内部机理 ...
- NumPy 超详细教程(2):数据类型
系列文章地址 NumPy 最详细教程(1):NumPy 数组 NumPy 超详细教程(2):数据类型 NumPy 超详细教程(3):ndarray 的内部机理及高级迭代 文章目录 NumPy 数据类型 ...
- NumPy 超详细教程(1):NumPy 数组
系列文章地址 NumPy 最详细教程(1):NumPy 数组 NumPy 超详细教程(2):数据类型 NumPy 超详细教程(3):ndarray 的内部机理及高级迭代 文章目录 Numpy 数组:n ...
- 数学规划求解器lp_solve超详细教程
前言 最近小编学了运筹学中的单纯形法.于是,很快便按奈不住跳动的心.这不得不让我拿起纸和笔思考着,一个至关重要的问题:如何用单纯形法装一个完备的13? 恰巧,在我坐在图书馆陷入沉思的时候,一位漂亮的小 ...
- c++ 网络编程(九)LINUX/windows-IOCP模型 多线程超详细教程及多线程实现服务端
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9661012.html 先讲Linux下(windows下在后面可以直接跳到后面看): 一.线程 ...
- Java中的经典算法之冒泡排序(Bubble Sort)
Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...
- Github上传代码菜鸟超详细教程【转】
最近需要将课设代码上传到Github上,之前只是用来fork别人的代码. 这篇文章写得是windows下的使用方法. 第一步:创建Github新账户 第二步:新建仓库 第三部:填写名称,简介(可选), ...
- WebRTC VideoEngine超详细教程(三)——集成X264编码和ffmpeg解码
转自:http://blog.csdn.net/nonmarking/article/details/47958395 本系列目前共三篇文章,后续还会更新 WebRTC VideoEngine超详细教 ...
随机推荐
- CF1422
CF1422 那个博客搭好遥遥无期. A: 看代码就行. #include<bits/stdc++.h> using namespace std; void work() { int a, ...
- 记安装MySQL数据库
记录一次自己动手安装MySQL数据库所踩的坑 MySQL安装包与操作系统匹配 安装包有amd和Intel,32位.64位多种组合需要确认仔细使用者操作系统和CPU型号 例如我使用的是CentOS ...
- Ensemble learning A survey 论文阅读
Ensemble learning A survey是2018年发表的一篇关于集成学习的综述性论文 发展 在Surowiecki的书中The Wisdom of Crowds,当符合以下标准时,大众的 ...
- 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 ...
- Servlet's characters of get and post
Tomcat默认是使用ISO8859-1来解码的,ISO8859-1是不支持中文的. 1.post请求解决乱码原因: 服务器不知道按哪种编码来处理HTML等文件来响应给浏览器的,所以处理post请求时 ...
- Json对象转换模块(自编代码JsonObject.cs)
namespace 信息采集系统.Common { /// <summary> /// Json类型对象,用于其它Json对象继承 /// </summary> /// < ...
- [Lua]敏感字检测
参考链接: https://zhuanlan.zhihu.com/p/84685657 https://www.cnblogs.com/luguoshuai/p/9254190.html 一开始打算使 ...
- swiper常见问题、动态加载数据问题
swiper加载静态文件是没有问题的 swiper加载动态文件需要在请求后再加载这个函数 参考链接: https://blog.csdn.net/webzrh/article/details/781 ...
- Centos7安装nodejs(npm)
执行命令: 设置yum安装源> curl --silent --location https://rpm.nodesource.com/setup_14.x | sudo bash (14是大的 ...
- react hooks(useState、useEffect、useRef详解)
好巧不巧,工作了一年跳槽了,之前用的vue,现在用的react- 嗯!工作使人进步!现在开始学react吧! 切入正题- react hooks是React16.8.0之后出现的, 类组件存在的问题: ...