【python算法学习2】冒泡排序的写法

目的:学习冒泡排序的写法

1 定义

1.1百度百科

冒泡排序_百度百科在程序设计语言中,排序算法主要有冒泡排序、快速排序、选择排序以及计数排序等。冒泡排序(Bubble Sort)是最简单和最通用的排序方法,其基本思想是:在待排序的一组数中,将相邻的两个数进行比较,若前面的数比后面的数大就交换两数,否则不交换;如此下去,直至最终完成排序。由此可得,在排序过程中,大的数据往下沉,小的数据往上浮,就像气泡一样,于是将这种排序算法形象地称为冒泡排序。icon-default.png?t=N7T8https://baike.baidu.com/item/%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F/4602306?fr=ge_ala

2 冒泡程序

2.1 标准的冒泡程序

def bubble_sort(nums):for i in range(len(nums) - 1):  # 这个循环负责设置冒泡排序进行的次数for j in range(len(nums) - i - 1):  # j为列表下标if nums[j] > nums[j + 1]:nums[j], nums[j + 1] = nums[j + 1], nums[j]return numsprint(bubble_sort([45, 32, 8, 33, 12, 22, 19, 97]))
[8, 12, 19, 22, 32, 33, 45, 97]

2.2 详细的冒泡展开(方便看清楚过程)

  • 第1层:循环次数,只循环循环 len(list)-1 次
  • 第2层:for j in range(len(nums) - i - 1):  # j为列表下标,后面的已经排好序,只继续比较前面的。
  • 不需要全部整个数组比较
  • 第2层:挨个比较前面的 j 和 j+1 两个相邻元素
def bubble_sort(nums):print("目标进行升序排列的冒泡排序")print("最初的nums=",nums)   for i in range(len(nums) - 1):  # 这个循环负责设置冒泡排序进行的次数  #且不需要最后1个元素再比了,少1轮print("第",i+1,"轮比较--","从第",i,"个元素","开始比较:")for j in range(len(nums) - i - 1):  # j为列表下标,后面的已经排好序,只继续比较前面的。if nums[j] > nums[j + 1]:print("第",j,"和",j+1,"相邻两个元素:",nums[j],">",nums[j+1],"需要交换位置,大的右移",end=",")nums[j], nums[j + 1] = nums[j + 1], nums[j]print("修改后--","后的nums=",nums) print("第",i+1,"轮比较--","后的nums=",nums,end="\n") print("")print("最终的nums=",nums)            return numsprint(bubble_sort([45, 32, 8, 33, 12, 22, 19, 97]))

 2.3 运行的过程

目标进行升序排列的冒泡排序
最初的nums= [45, 32, 8, 33, 12, 22, 19, 97]
第 1 轮比较-- 从第 0 个元素 开始比较:
第 0 和 1 相邻两个元素: 45 > 32 需要交换位置,大的右移,修改后-- 后的nums= [32, 45, 8, 33, 12, 22, 19, 97]
第 1 和 2 相邻两个元素: 45 > 8 需要交换位置,大的右移,修改后-- 后的nums= [32, 8, 45, 33, 12, 22, 19, 97]
第 2 和 3 相邻两个元素: 45 > 33 需要交换位置,大的右移,修改后-- 后的nums= [32, 8, 33, 45, 12, 22, 19, 97]
第 3 和 4 相邻两个元素: 45 > 12 需要交换位置,大的右移,修改后-- 后的nums= [32, 8, 33, 12, 45, 22, 19, 97]
第 4 和 5 相邻两个元素: 45 > 22 需要交换位置,大的右移,修改后-- 后的nums= [32, 8, 33, 12, 22, 45, 19, 97]
第 5 和 6 相邻两个元素: 45 > 19 需要交换位置,大的右移,修改后-- 后的nums= [32, 8, 33, 12, 22, 19, 45, 97]
第 1 轮比较-- 后的nums= [32, 8, 33, 12, 22, 19, 45, 97]第 2 轮比较-- 从第 1 个元素 开始比较:
第 0 和 1 相邻两个元素: 32 > 8 需要交换位置,大的右移,修改后-- 后的nums= [8, 32, 33, 12, 22, 19, 45, 97]
第 2 和 3 相邻两个元素: 33 > 12 需要交换位置,大的右移,修改后-- 后的nums= [8, 32, 12, 33, 22, 19, 45, 97]
第 3 和 4 相邻两个元素: 33 > 22 需要交换位置,大的右移,修改后-- 后的nums= [8, 32, 12, 22, 33, 19, 45, 97]
第 4 和 5 相邻两个元素: 33 > 19 需要交换位置,大的右移,修改后-- 后的nums= [8, 32, 12, 22, 19, 33, 45, 97]
第 2 轮比较-- 后的nums= [8, 32, 12, 22, 19, 33, 45, 97]第 3 轮比较-- 从第 2 个元素 开始比较:
第 1 和 2 相邻两个元素: 32 > 12 需要交换位置,大的右移,修改后-- 后的nums= [8, 12, 32, 22, 19, 33, 45, 97]
第 2 和 3 相邻两个元素: 32 > 22 需要交换位置,大的右移,修改后-- 后的nums= [8, 12, 22, 32, 19, 33, 45, 97]
第 3 和 4 相邻两个元素: 32 > 19 需要交换位置,大的右移,修改后-- 后的nums= [8, 12, 22, 19, 32, 33, 45, 97]
第 3 轮比较-- 后的nums= [8, 12, 22, 19, 32, 33, 45, 97]第 4 轮比较-- 从第 3 个元素 开始比较:
第 2 和 3 相邻两个元素: 22 > 19 需要交换位置,大的右移,修改后-- 后的nums= [8, 12, 19, 22, 32, 33, 45, 97]
第 4 轮比较-- 后的nums= [8, 12, 19, 22, 32, 33, 45, 97]第 5 轮比较-- 从第 4 个元素 开始比较:
第 5 轮比较-- 后的nums= [8, 12, 19, 22, 32, 33, 45, 97]第 6 轮比较-- 从第 5 个元素 开始比较:
第 6 轮比较-- 后的nums= [8, 12, 19, 22, 32, 33, 45, 97]第 7 轮比较-- 从第 6 个元素 开始比较:
第 7 轮比较-- 后的nums= [8, 12, 19, 22, 32, 33, 45, 97]最终的nums= [8, 12, 19, 22, 32, 33, 45, 97]
[8, 12, 19, 22, 32, 33, 45, 97]

3 其他变种的排序,类冒泡排序?

3.1 如下这个排序

 用第i个位置的元素,去与数组里的每个元素比较大小,实现排序

#排序?
list1= [3, 7, 1.5, 2, 5,10,-2,6]
#print(len(list1))=8
for i in range(len(list1)):    #i=range(0~8)=0~7for j in range(i + 1):     #j=range(0~(0~7)+1)=0~(1~8)=if list1[i] < list1[j]:list1[i], list1[j] = list1[j], list1[i]
print(list1)#排序?
list1= [3, 7, 1.5, 2, 5,10,-2,6]
#print(len(list1))=8
for i in range(len(list1)):    #i=range(0~8)=0~7for j in range(i + 1):     #j=range(0~(0~7)+1)=0~(1~8)=if list1[i] > list1[j]:list1[i], list1[j] = list1[j], list1[i]
print(list1)
[-2, 1.5, 2, 3, 5, 6, 7, 10]
[10, 7, 6, 5, 3, 2, 1.5, -2]

3.2 详细展开

# 变种排序?---全展开
list1= [3, 7, 1.5, 2, 5,10,-2,6]    #list不能太少?
print("最初的list1=",list1)
#print(len(list1))=8for i in range(len(list1)):    #i=range(0~8)=0~7print("第",i,"轮")print("index=",i,"的元素")for j in range(i + 1):     #j=range(0~(0~7)+1)=0~(1~8)=if list1[i] < list1[j]:print(list1[i],",",list1[j],"内容交换,修改为→",list1[j],",",list1[i])list1[i], list1[j] = list1[j], list1[i]else:print(list1[i],">=",list1[j],"因此相对位置不变")print("现在的list1=",list1)       
print("最终的list1=",list1)

3.3 详细运行过程

最初的list1= [3, 7, 1.5, 2, 5, 10, -2, 6]
从第 0 个元素 找起 与列表里所有元素挨个遍历比较大小
3 >= 3 因此相对位置不变
现在的list1= [3, 7, 1.5, 2, 5, 10, -2, 6]
从第 1 个元素 找起 与列表里所有元素挨个遍历比较大小
7 >= 3 因此相对位置不变
7 >= 7 因此相对位置不变
现在的list1= [3, 7, 1.5, 2, 5, 10, -2, 6]
从第 2 个元素 找起 与列表里所有元素挨个遍历比较大小
1.5 , 3 内容交换,修改为→ 3 , 1.5
3 , 7 内容交换,修改为→ 7 , 3
7 >= 7 因此相对位置不变
现在的list1= [1.5, 3, 7, 2, 5, 10, -2, 6]
从第 3 个元素 找起 与列表里所有元素挨个遍历比较大小
2 >= 1.5 因此相对位置不变
2 , 3 内容交换,修改为→ 3 , 2
3 , 7 内容交换,修改为→ 7 , 3
7 >= 7 因此相对位置不变
现在的list1= [1.5, 2, 3, 7, 5, 10, -2, 6]
从第 4 个元素 找起 与列表里所有元素挨个遍历比较大小
5 >= 1.5 因此相对位置不变
5 >= 2 因此相对位置不变
5 >= 3 因此相对位置不变
5 , 7 内容交换,修改为→ 7 , 5
7 >= 7 因此相对位置不变
现在的list1= [1.5, 2, 3, 5, 7, 10, -2, 6]
从第 5 个元素 找起 与列表里所有元素挨个遍历比较大小
10 >= 1.5 因此相对位置不变
10 >= 2 因此相对位置不变
10 >= 3 因此相对位置不变
10 >= 5 因此相对位置不变
10 >= 7 因此相对位置不变
10 >= 10 因此相对位置不变
现在的list1= [1.5, 2, 3, 5, 7, 10, -2, 6]
从第 6 个元素 找起 与列表里所有元素挨个遍历比较大小
-2 , 1.5 内容交换,修改为→ 1.5 , -2
1.5 , 2 内容交换,修改为→ 2 , 1.5
2 , 3 内容交换,修改为→ 3 , 2
3 , 5 内容交换,修改为→ 5 , 3
5 , 7 内容交换,修改为→ 7 , 5
7 , 10 内容交换,修改为→ 10 , 7
10 >= 10 因此相对位置不变
现在的list1= [-2, 1.5, 2, 3, 5, 7, 10, 6]
从第 7 个元素 找起 与列表里所有元素挨个遍历比较大小
6 >= -2 因此相对位置不变
6 >= 1.5 因此相对位置不变
6 >= 2 因此相对位置不变
6 >= 3 因此相对位置不变
6 >= 5 因此相对位置不变
6 , 7 内容交换,修改为→ 7 , 6
7 , 10 内容交换,修改为→ 10 , 7
10 >= 10 因此相对位置不变
现在的list1= [-2, 1.5, 2, 3, 5, 6, 7, 10]
最终的list1= [-2, 1.5, 2, 3, 5, 6, 7, 10]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/44982.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式 - 最简单最有趣的方式讲述

别名《我替你看Head First设计模式》 本文以故事的形式带你从0了解设计模式&#xff0c;在其中你仅仅是一名刚入职的实习生&#xff0c;在项目中摸爬滚打。&#xff08;以没有一行真正代码的形式&#xff0c;让你无压力趣味学习&#xff09; 设计模式 策略模式观察者模式装饰者…

springboot仪器校准系统-计算机毕业设计源码51504

摘 要 随着科技的不断发展。测量设备的准确性和可靠性对于各行各业都至关重要。仪器校准系统作为确保测量设备性能的重要手段&#xff0c;已成为工业生产、科学研究、质量控制等领域不可或缺的一部分。本文对仪器校准系统进行了概述&#xff0c;探讨了校准方法、流程、特点、应…

Apache防盗链、网页压缩、网页缓存

目录 网页压缩 类型 示例 动态添加模块操作步骤 重装Apache操作步骤 网页缓存 示例 操作步骤 隐藏版本信息 操作步骤 Apache防盗链 定义 原理 配置防盗链实验环境 实验环境 本地图片盗链示例 操作步骤 防盗链示例 操作步骤 网页压缩 网站的访问速度是由多个…

following a different leader because i am not the healthiest node

源代码 解决方案&#xff1a; 手动 patronictl failover 修改切换模式从高可靠模式改成高可用模式 patronictl edit-config-synchronous_mode: true synchronous_mode: false

透明加密软件哪个好?这5款好用的加密软件尽在你眼前!

数据安全和隐私保护已成为企业和个人不可忽视的重要问题。 透明加密技术以其无需用户额外操作即可实现文件的加密和解密&#xff0c;大大提高了数据处理的便捷性和安全性。 下面小编将为您介绍五款优质的透明加密软件&#xff0c;帮助您选择最适合自己的加密工具。 1. Pg32 …

超秒集物商城打造“私域流量新策略”用消费增值破解流量困局

消费增值模式是什么?在如今这个公域流量的竞争愈发激烈的时代,流量已成为企业竞争的关键,消费增值可以帮助企业在私域流量的海洋中乘风破浪? 一、消费增值模式的引入 消费增值模式不仅仅是一种商业模式,更是一种营销策略。它鼓励消费者在享受商品或服务的同时,通过消费行为获…

KEIL5 MDK的(官网)下载安装(Win11)

一、KEIL5 MDK下载 1、Keil官网下载&#xff1a;Keil Product Downloadshttps://www.keil.com/download/product/ 支持包和破解软件和V5编译器下载链接 链接&#xff1a;https://pan.baidu.com/s/1ery0Q3FAR8_bLLlPQHSFNg?pwd9pxf 提取码&#xff1a;9pxf 选择最新版本下载&…

打造高效能“园区企业服务平台”,让企业更好更快发展!

​近年来&#xff0c;随着我国经济的快速发展&#xff0c;各地产业园区建设如火如荼&#xff0c;成为区域经济的支柱&#xff0c;如果说园区是区域经济的支柱&#xff0c;企业则是园区的血液&#xff0c;给园区带来生命力&#xff0c;为园区发展提供着动力&#xff0c;各地政府…

electron + express 实现 vue 项目客户端部署

写在前面 作为一个前端程序员&#xff0c;如何实现从前端到客户端的跨越&#xff0c;可能是一个很难实现的事。但客户需求千奇百怪&#xff0c;偶尔遇到一个非要客户端的&#xff0c;如何应对&#xff1f; 那Electron可能真是你福音。具体它有哪些功能&#xff0c;可自行官网…

向日葵IT运维节丨解决三个关键问题,搞好企业IT运维

724运维节&#xff0c;是所有运维人的节日&#xff0c;贝锐向日葵也在这一天致敬所有需要7x24小时待命的运维人&#xff0c;将这一天定为“向日葵IT运维节”&#xff0c;为广大运维人带来大量专属福利&#xff01; 724这组数字&#xff0c;折射出运维人的日常&#xff0c;即7x2…

c++多态的定义和原理

目录 1、多态的定义和实现 1.多态的构成条件 2.虚函数 3.虚函数的重写(覆盖) 4.虚函数重写的两个例外 5.c11 override和final 6.重载&#xff0c;覆盖(重写)和隐藏(重定义) 2、抽象类 概念 接口继承和实现继承 3、多态的原理 1.虚函数表 2.多态的原理 4、多继承中的虚…

MessageBox与HubSpot:企业沟通与客户管理的双重利器

今天咱们来聊聊两个超实用的工具——MessageBox和HubSpot。它们就像是你的超级助手&#xff0c;让你和客户沟通起来更顺畅&#xff0c;管理起来也更轻松。 先说说MessageBox吧 想象一下&#xff0c;你正在忙着工作&#xff0c;突然客户发来个消息&#xff0c;你嗖的一下就收到…

常见网页问题解决

用edge浏览器打印功能时&#xff0c;出现瞬间或加载几秒后突然闪退情况&#xff0c;本来以为是浏览器出了问题&#xff0c;去重置设置也没有&#xff0c;后来又下载了Chrome浏览器&#xff0c;没想到还是一样&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;想着…

windows安装Docker Desktop及国内镜像

简介 Docker 是一个开源的应用容器引擎&#xff0c;它让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。通过Docker工具&#xff0c;简化了应用的部署、配置和管理过程&#xff0c;提高…

2024年五款企业加密软件(企业加密软件排行最新)

关键是数字化时代&#xff0c;企业数据安全至关重要。一般来说信息技术快速发展&#xff0c;企业数据泄露风险上升。你知道的加密软件保护企业核心数据和商业机密&#xff0c;不可或缺。对我而言介绍几款企业加密软件&#xff0c;帮助选择适合需求的解决方案。 固信加密软件ht…

性价比高充电宝有哪些?充电宝十大最佳品牌大盘点!

在如今这个高度数字化的时代&#xff0c;我们的生活离不开各种电子设备&#xff0c;而充电宝作为保障电子设备续航的重要工具&#xff0c;其地位日益凸显。然而&#xff0c;面对市场上琳琅满目的充电宝品牌和产品&#xff0c;要挑选到一款性价比高的充电宝并非易事。在这篇盘点…

C++20中的指定初始化器(designated initializers)

指定初始化器(designated initializers, 指定初始值设定项)语法如下&#xff1a;C风格指定初始化器语法&#xff0c;初始化数据成员的一种便捷方式 T object { .des1 arg1, .des2 { arg2 } ... }; T object { .des1 arg1, .des2 { arg2 } ... }; 说明&#xff1a; 1.每个指…

2024做TEMU跨境电商,全托管/半托管模式怎么选?

如果说2023年&#xff0c;“全托管”是跨境圈的热词&#xff0c;那2024年一定少不了“半托管”。 自2024年1月&#xff0c;速卖通首次推出半托管模式后&#xff0c;引发了众跨境卖家的热议&#xff1b;而TEMU随后在3月也推出半托管模式&#xff0c;便迅速使得半托管这一模式开始…

盲人出行好帮手:蝙蝠避障让走路变简单

在一片无光的世界里&#xff0c;每一步都承载着探索与勇气。我是众多盲人中的一员&#xff0c;每天的出行不仅是从&#xff21;点到&#xff22;点的物理移动&#xff0c;更是一场心灵的征程。我的世界&#xff0c;虽然被剥夺了视觉的馈赠&#xff0c;却因科技的力量而变得宽广…

Visual Studio 2019 (VS2019) 中使用 CMake 配置 OpenCV 库(快捷版)

2024.07.11 测试有效 最近需要用一下 opencv 处理图像&#xff0c;简单配置了一下Cmake下的 opencv 库。 没有编译 opencv &#xff0c;也不知道他们为什么要自己编译 opencv 。 一、下载并安装 OpenCV 1.前往 OpenCV 官方网站 下载适用于您的系统的 OpenCV 安装包。 2.点击直接…