算法之冒泡排序

算法之冒泡排序

冒泡排序Bubble Sort

  • 交换排序
  • 相邻元素两两比较大小,有必要则交换。
  • 元素越小或越大,就会在数列中慢慢的交换并“浮”向顶端,如同水泡咕嘟咕嘟往上冒。

核心算法

  • 排序算法,一般都实现为就地排序,输出为升序
  • 扩大有序区,减小无序区。图中红色部分就是增大的有序区,反之就是减小的无序区
  • 每一趟比较中,将无序区中所有元素依次两两比较,升序排序将大数调整到两数中的右侧
  • 每一趟比较完成,都会把这一趟的最大数推倒当前无序区的最右侧

nums = [1, 9, 8, 5]  # 定义一个nums变量
#length = len(nums)j = 0for j in range(3): # 定义一个for循环,if nums[j] > nums[j+1]:  # if判断,索引0 大于 索引1nums[j], nums[j+1] = nums[j+1], nums[j] # 就进行两两交换,直到把最大一个数交换到列表尾端,变成有序区print(nums) # 第一次交换完打印j = 1
for j in range(2):if nums[j] > nums[j+1]:nums[j], nums[j+1] = nums[j+1], nums[j]print(nums)# 返回结果:[1, 8, 5, 9]
# 返回结果:[1, 5, 8, 9]
# 优化
nums = [1, 9, 8, 5]
length = len(nums)for i in range(length - 1):for j in range(length - 1 - i): # length - 1 - i 3 - 0 j = 0 1 2if nums[j] > nums[j+1]:nums[j], nums[j+1] = nums[j+1], nums[j]print(nums)# 先取出nums的长度,length,通过迭代length的值可以确定循环执行的范围。
# 返回结果:[1, 5, 8, 9]
nums = [1, 9, 8, 5, 4, 3, 2, 7, 6]
length = len(nums)for i in range(length - 1):for j in range(length - 1 - i): # length - 1 - i 3 - 0 j = 0 1 2if nums[j] > nums[j+1]:nums[j], nums[j+1] = nums[j+1], nums[j]print(nums) # 这个打印,是打印循环每次执行的结果print(nums)# 返回结果:[1, 5, 8, 9]

图一

在这里插入图片描述
可以看到后4趟执行的结果是没有变化的,就是执行了无用的循环。

# 优化nums = [1, 9, 8, 5, 4, 3, 2, 7, 6]
length = len(nums)
count = 0 # 表示执行的次数
count_swap = 0 # 表示交换的次数for i in range(length - 1):swapped = False  # 如果发生变化就是True,没有发生变化才是Falsefor j in range(length - 1 - i): # length - 1 - i 3 - 0 j = 0 1 2count += 1if nums[j] > nums[j+1]:nums[j], nums[j+1] = nums[j+1], nums[j]swapped = Truecount_swap += 1print(nums)if not swapped: # 条件判断,如果没有发生交换break # break 终止循环print(nums)
print(count, count_swap)

图二

在这里插入图片描述
上面代码执行结果。

# 最终代码nums = [1, 9, 8, 5, 4, 3, 2, 7, 6] # 定义一个无序区
length = len(nums) # nums的长度for i in range(length - 1):  #循环与次数相关就是O(n) # i循环控制趟数swapped = True # 用于终止循环的条件for j in range(length - 1 - i): #循环与次数相关就是O(n) # j循环控制比较,有序区与无序区if nums[j] > nums[j+1]:nums[j], nums[j+1] = nums[j+1], nums[j]swapped = Falseif swapped: # 如果swapped的值是True就证明没有在进行交换了。break   # 终止循环print(nums) # O(n * n) O(n**2) On方# 循环的时间复杂度是O(n), 双层循环的时间复杂度是O(n**2)也就是On方
# 返回结果:[1, 2, 3, 4, 5, 6, 7, 8, 9]

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

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

相关文章

《轻松入门!快速安装PyCharm,打造高效Python编程环境》

「Pycharm安装包和相关插件(Windows 64位)」https://www.aliyundrive.com/s/jByv6vjShVz 提取码: 1234 视频教程:https://www.douyin.com/video/7303106933521763596?previous_pageapp_code_link 第一步:找到一起下载的Pycharm安…

使用Docker/K8S部署项目流程

一、制作镜像: 1、创建nginx配置文件default.conf server {listen 80;server_name localhost; # 修改为docker服务宿主机的iplocation / {root /usr/share/nginx/html;index index.html index.htm;try_files $uri $uri/ /index.html 404;}error_page …

百胜杯答题系统

近期太忙了 百胜方答题活动于近期终于告一段落,这个活动周期长,参与人数多,是我这几年做答题活动的一个巅峰之作 当然项目开发难度不大,主要是参与人数突破了百万,对我而言是一次很好的历练 具体的设计方案 百胜杯答…

辅助笔记-Jupyter Notebook的安装和使用

辅助笔记-Jupyter Notebook的安装和使用 文章目录 辅助笔记-Jupyter Notebook的安装和使用1. 安装Anaconda2. conda更换清华源3. Jupter Notebooks 使用技巧 笔记主要参考B站视频“最易上手的Python环境配置——Jupyter Notebook使用精讲”。 Jupyter Notebook (此前被称为IPyt…

docker的基本使用以及使用Docker 运行D435i

1.一些基本的指令 1.1 容器 要查看正在运行的容器&#xff1a; sudo docker ps 查看所有的容器&#xff08;包括停止状态的容器&#xff09; sudo docker ps -a 重新命名容器 sudo docker rename <old_name> <new_name> <old_name> 替换为你的容器名称…

Vue3--Vue Router详解--学习笔记

1. 认识vue-router Angular的ngRouter React的ReactRouter Vue的vue-router Vue Router 是Vue.js的官方路由&#xff1a; 它与Vue.js核心深度集成&#xff0c;让Vue.js构建单页应用&#xff08;SPA&#xff09;变得非常容易&#xff1b;目前Vue路由最新的版本是4.x版本。 v…

VUE(一)

1.vue简介 英文官网: Vue.js - The Progressive JavaScript Framework | Vue.js 中文官网: Vue.js - 渐进式 JavaScript 框架 | Vue.js 2.Vue的特点 3.初识VUE 在官网下载VUE.js,有两个版本&#xff0c;一个开发一个生产 <!DOCTYPE html> <html lang"en"…

Java拼图

第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 创建一个代码类 和一个运行类 代码如下&#xff1a; package heima;import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import jav…

被锁总时间

题目描述&#xff1a; 对一个事务进行加锁与解锁&#xff0c;其中有加锁数组&#xff0c;解锁数组&#xff0c;这两个数组长度相等&#xff0c;且数组内数据代表加锁与解锁的具体时间点&#xff0c;求给出数组中事务的总被锁时间。&#xff08;其中加锁后默认在60秒后解锁&…

物联网AI MicroPython学习之语法 TIMER硬件定时器

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; TIMER 介绍 模块功能: 硬件定时器模块 接口说明 Timer - 构建Timer对象 函数原型&#xff1a;Timer(id)参数说明&#xff1a; 参数类型必选参数&#xff1f;说明idintY硬件定时器外设模块id&#xff1a…

QT下使用QChart绘制曲线

目录 头文件内容构造函数AddSeries方法UpdateSeries方法AppendSeriesData方法SetLegendVisiableSetRubberBandCPP内容测试函数 需要用到的头文件&#xff1a; #include <QtCharts/QChart> #include <QtCharts/QChartView> #include <QtCharts/QValueAxis> #…

YARN,ZOOKEERPER--学习笔记

1&#xff0c;YARN组件 1.1YARN简介 YARN表示分布式资源调度&#xff0c;简单地说&#xff0c;就是&#xff1a;以分布式技术完成资源的合理分配&#xff0c;让MapReduce能高效完成计算任务。 YARN是Hadoop核心组件之一&#xff0c;用于提供分布式资源调度服务。 而在Hadoop …