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

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

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

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

冒泡排序(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. uc 小游戏接入经验

    使用引擎,egret 相关资料: https://blog.csdn.net/weixin_42276579/article/details/107379544 https://minigame.uc ...

  2. What is RSS

    What is RSS?RSS (Rich Site Summary) is a format for delivering regularly changing web content. Many ...

  3. 实验3 C语言分支语句和循环语句编程应用

    任务一 #include<math.h> #include<stdio.h> int main() { float a,b,c,x1,x2; float delta,real, ...

  4. nextcloud file location

  5. python中创建列表、元组、字符串、字典

    >>> a = ["aaa","bbb","ccc"] ## 列表,中括号,逗号 >>> type(a) ...

  6. Asp.net MVC5中没有BundleConfig.cs-MVC学习笔记(一)

    创建ASP.NET MVC5项目时,选择了空项目,在App_Start文件夹中没有默认创建了BudleConfig.cs文件. 下面就来手动添加 在NuGet中搜索Microsoft.AspNet.W ...

  7. Matlab - 在Figure界面去掉图像的坐标刻度

    Matlab版本:2018b 经过一番尝试,发现有两种方法 第一种:修改坐标轴的Visible属性,去掉坐标轴数字和坐标轴标签 第二种:删除Tick,只去掉坐标轴数字 第一种 ①原图 ②如果有多个子图 ...

  8. LaravelORM 中的 withSum , withAvg, withMax,withMin 的实现

    Orm::withCount(['relation as relation_sum' =>function($query){ $query->select(DB::raw("su ...

  9. 笔精墨妙,妙手丹青,微软开源可视化版本的ChatGPT:Visual ChatGPT,人工智能AI聊天发图片,Python3.10实现

    说时迟那时快,微软第一时间发布开源库Visual ChatGPT,把 ChatGPT 的人工智能AI能力和Stable Diffusion以及ControlNet进行了整合.常常被互联网人挂在嘴边的& ...

  10. Android笔记--Activity--启停活动页面

    Activity启动 从当前页面跳转到新的页面:startActivity(new Intent(原页面.this,目标页面.class)) 而若是从当前页面返回到上一个页面,相当于关闭当前页面,使用 ...