算法之冒泡排序

算法之冒泡排序

冒泡排序Bubble Sort

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

核心算法

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

nums = [1, 9, 8, 5]  # 定义一个nums变量
#length = len(nums)

j = 0

for j in range(3): # 定义一个for循环,
    if nums[j] > nums[j+1]:  # if判断,索引0 大于 索引1
        nums[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 2
        if 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 2
        if 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,没有发生变化才是False
    for j in range(length - 1 - i): # length - 1 - i 3 - 0 j = 0 1 2
        count += 1
        if nums[j] > nums[j+1]:
            nums[j], nums[j+1] = nums[j+1], nums[j]
            swapped = True
            count_swap += 1
            
    print(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 = False
    if 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]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Oracle主备切换,ogg恢复方法(集成模式)

前言: 文章主要介绍Oracle数据库物理ADG主备在发生切换时(switchover,failover),在主库运行的ogg进程(集成模式)如何进行恢复。 测试恢复场景,因为集成模式不能在备库配置,所以场景都是基于主库端: 1 主备发生switchover切换,主库…

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

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

图像处理01 小波变换

一.为什么需要离散小波变换 连续小波分解,通过改变分析窗口大小,在时域上移动窗口和基信号相乘,最后在全时域上整合。通过离散化连续小波分解可以得到伪离散小波分解, 这种离散化带有大量冗余信息且计算成本较高。 小波变换的公…

Java拼图

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

LeetCode - 622. 设计循环队列(C语言,顺序存储结构,配图)

622. 设计循环队列 - 力扣(LeetCode) 设计循环队列,我们可以从顺序结构和链式结构来考虑,但因为链式结构实现起来较为复杂,不易理解,且主流使用顺序存储,所以本文就是用顺序存储结构实现。 因为…

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

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

Linux:安装软件的两种方式rpm和yum

一、rpm方式 1、简单介绍 RPM是RedHat Package Manager的缩写,它是Linux上打包和安装的工具。通过rpm打包的文件扩展名是.RPM。这个安装包就类似Windows系统中的.exe文件。rpm工具实现Linux上软件的离线安装。 2、软件相关信息的查询命令 查询Linux系统上所有已…

数睿通2.0数据接入、数据开发、系统权限、集群监控全面升级

引言 数睿通 2.0 数据中台迎来了11月份的更新,感谢大家的支持,本次更新主要包括以下内容: 数据库支持 MongoDB数据接入支持 MongoDB,支持自定义 SQL 采集,支持停止运行中的任务数据生产支持 FlinkJar 任务&#xff0…

吴恩达《机器学习》9-1-9-3:反向传播算法、反向传播算法的直观理解

一、正向传播的基础 在正向传播中,从神经网络的输入层开始,通过一层一层的计算,最终得到输出层的预测结果。这是一种前向的计算过程,即从输入到输出的传播。 二、反向传播算法概述 反向传播算法是为了计算代价函数相对于模型参数…

LeetCode【13】罗马数字转整数

题目: 思路: 第十二题的逆运算,方法同理。需要注意的是IV、IX、XL、XC、CD、CM这六种特殊的情况。正常情况下每个字符找到对应的数值累加,这六种特殊字符都是左边的数值比右边的数值小。 这里以IV举例,IV对应数字是1和…

EMNLP2023 | 基于显式证据推理的few-shot关系抽取CoT

深度学习自然语言处理 原创作者:wkk 论文:Chain of Thought with Explicit Evidence Reasoning for Few-shot Relation Extraction地址:https://arxiv.org/abs/2311.05922 摘要 Few-shot关系提取涉及使用有限数量的注释样本识别文本中两个特定…

数据结构与算法之美学习笔记:22 | 哈希算法(下):哈希算法在分布式系统中有哪些应用?

目录 前言应用五:负载均衡应用六:数据分片应用七:分布式存储解答开篇 & 内容小结 前言 本节课程思维导图 今天,我们再来看剩余三种应用:负载均衡、数据分片、分布式存储。你可能已经发现,这三个应用都…

gitlab环境准备

1.准备环境 gitlab只支持linux系统,本人在虚拟机下使用Ubuntu作为操作系统,gitlab镜像要使用和操作系统版本对应的版本,(ubuntu18.04,gitlab-ce_13.2.3-ce.0_amd64 .deb) book100ask:/$ lsb_release -a No LSB modules are available. Dist…

YARN,ZOOKEERPER--学习笔记

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

公司内部网络架设悟空CRM客户管理系统 cpolar无需公网IP实现内网,映射端口外网访问

1、什么是内网穿透? 内网穿透,即内网映射,内网IP端口映射到外网的过程。是一种主动的操作,需要本人一些内网的权限。比如在公司自己电脑,将办公OA发布到互联网,然后提供外网在家或出差在外连接访问。 可以…

【信息安全】浅谈三种XSS(跨站脚本攻击)的攻击流程与防御措施

银狼美图镇楼 XSS 跨站脚本攻击(Cross-Site Scripting,简称XSS)是一种常见的Web安全漏洞,攻击者通过在Web应用中注入恶意脚本,使得浏览器在解析页面时执行该脚本,从而实现攻击目的。 类型 存储型XSS&…

Ubuntu中apt-get update显示域名解析失败

第一步 检查主机->虚拟机能否ping成功 ping 红色框中的IPv4地址 能通,表示虚拟机ip配置成功;否则,需要先配置虚拟机ip 第二步 检查是否能ping成功百度网址 ping www.baidu.com 若不成功,可能原因 虚拟机没联网,打开火狐浏览器…

leetcode刷题日记:190. Reverse Bits(颠倒二进制位)和191. Number of 1 Bits( 位1的个数)

190. Reverse Bits(颠倒二进制位) 题目要求我们将一个数的二进制位进行颠倒,画出图示如下(以8位二进制为例): 显然对于这种问题我们需要用到位操作,我们需要将原数的每一位取出来然后颠倒之后放进另一个数。 我们需要…

CHM文件阅读必备:CHM Viewer Star 免激活

CHM Viewer Star for Mac是一款针对Mac系统的CHM文件查看器,具有以下功能特点: 快速打开和加载CHM文件:采用高效的解码引擎,可以快速打开和阅读CHM文件,同时系统资源占用少,用户可以流畅地阅读大型CHM文件…

文本向量化

文本向量化表示的输出比较 import timeimport torch from transformers import AutoTokenizer, AutoModelForMaskedLM, AutoModel# simcse相似度分数 def get_model_output(model, tokenizer, text_str):"""验证文本向量化表示的输出:param model: 模型的…