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

news2024/11/13 8:59:56

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

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 nums

print(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 nums

print(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~7
    for 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~7
    for 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))=8

for i in range(len(list1)):    #i=range(0~8)=0~7
    print("第",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.coloradmin.cn/o/1917917.html

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

相关文章

EchoMimic 数字人项目:语音驱动图像说话项目

参考: https://github.com/BadToBest/EchoMimic 安装 下载模型 下载位置放到下面下载代码目录下, cd EchoMimic 下 export HF_ENDPOINT=https://hf-mirror.comhuggingface-cli download --resume-download --local-dir-use-symlinks False BadToBest/EchoMimic --local-d…

红酒的甜蜜秘密:如何搭配甜点?

在品味美食的旅程中&#xff0c;甜点与红酒的搭配总是能带来意想不到的惊喜。红酒的醇厚与甜点的细腻&#xff0c;在口中交织出美妙的旋律&#xff0c;让人陶醉不已。今天&#xff0c;就让我们一起探索红酒的甜蜜秘密&#xff0c;看看如何与甜点很好搭配&#xff0c;享受这一场…

PCL报ptr 释放错误(Memory.h文件中aligned_free(void *ptr)触发了一个断点)

今天跑PCL处理点云&#xff0c;上来一个下马威&#xff0c;关于内存的。反复检查代码以后还是报错.于是反复查看代码&#xff0c;并搜罗指针释放&#xff0c;都没有解决。一番操作才知道是设置配置问题。下面记录一下解决过程&#xff1a; &#xff08;1&#xff09;编译报错弹…

死灰复燃的 LockBit, “现身说法”计算机安全的重要性

LockBit 死灰复燃 2024年2月&#xff0c;一场全球性的名为 “Cronos 行动” 的执法行动夺取了对 LockBit 勒索组织基础设施的控制权并扰乱了其运营。 但是&#xff0c;就像希腊神话中的九头蛇一样&#xff0c;砍掉一个 LockBit 的头并不重要——它可以迅速再生成多个新的头。…

PCL:点云均匀采样滤波并保存ply文件(附完整源码)

均匀采样滤波基本上等同于体素滤波器&#xff0c;但是其不改变点的位置。下采样后&#xff0c;其点云分布基本均匀&#xff0c;但是其点云的准确度要好于体素滤波&#xff0c;因为没有移动点的位置。均匀采样算法&#xff1a;均匀采样通过构建指定半径的球体对点云进行下采样滤…

CV05_深度学习模块之间的缝合教学(1)

1.1 在哪里缝 测试文件&#xff1f;&#xff08;&#xff09; 训练文件&#xff1f;&#xff08;&#xff09; 模型文件&#xff1f;&#xff08;√&#xff09; 1.2 骨干网络与模块缝合 以Vision Transformer为例&#xff0c;模型文件里有很多类&#xff0c;我们只在最后…

【Pytorch】Conda环境下载慢换源/删源/恢复默认源

文章目录 背景临时换源永久换源打开conda配置condarc换源执行配置 命令行修改源添加源查看源 删源恢复默认源使用示范 背景 随着实验增多&#xff0c;需要分割创建环境的情况时有出现&#xff0c;在此情况下使用conda create --name xx python3.10 pytorch torchvision pytorc…

maven——(重要)手动创建,构建项目

创建项目 手动按照maven层级建好文件夹&#xff0c;并写上java&#xff0c;测试代码和pom文件 构建项目 在dos窗口中执行如下命令 compile编译 当前maven仓库中什么都没有。 在pom所在层级下&#xff0c;执行&#xff1a; mvn compile 就开始显示下面这些&#xff0c;…

整数的英语表示

题目链接 整数的英语表示 题目描述 注意点 0 < num < 2^31 - 1 解答思路 每三个数字形成一组&#xff08;高位不足的部分可以用0填充&#xff09;&#xff0c;使用StringBuilder拼接每组的数字和单位关键是三个数字的英语表示&#xff0c;包含个位、十位、百位&…

java入门-告别C进入java世界

目标 java体系 java开发环境 helloworld java语法 java体系 java开发环境 安装JDK JDK&#xff1a; Java Developement Kit 配置jdk 为什么需要配置 操作系统找不到此程序 操作系统PATH PATH C:\Users\49354>echo %PATH% C:\Program Files (x86)\VMware\VMware Works…

Java---SpringBoot详解一

人性本善亦本恶&#xff0c; 喜怒哀乐显真情。 寒冬暖夏皆有道&#xff0c; 善恶终归一念间。 善念慈悲天下广&#xff0c; 恶行自缚梦难安。 人心如镜自省照&#xff0c; 善恶分明照乾坤。 目录 一&#xff0c;入门程序 ①&#xff0c;创建springboot工程&#…

安泰电压放大器的选型方案是什么

电压放大器是一种常见的电路元件&#xff0c;广泛应用于各种电子设备中。在选择电压放大器的时候&#xff0c;我们需要考虑一系列因素&#xff0c;以确保选型方案能够满足实际需求。下面安泰电子将详细介绍电压放大器选型的主要考虑因素&#xff0c;包括应用需求、技术性能、成…

CSDN回顾与前行:我的创作纪念日——2048天的技术成长与感悟

CSDN回顾与前行&#xff1a;我的创作纪念日——2048天的技术成长与感悟 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 前言 时光荏苒&#xff0c;岁月如梭。转眼间&#xff0c;从我在CSDN上写下第一篇技术博客《2-6 带头结点的链式表操作…

《WebGIS快速开发教程》第7版发布

老规矩先看封面&#xff1a; 可以看到我们在封面上加了“classic”的字样&#xff0c;这意味着第7版将会是经典版本&#xff0c;或者说具有里程碑意义的一个版本。 拿到新书我们可以看到第7版的整体风格是以“业务场景”为核心&#xff0c;所有讲解的知识点和案例都是围绕着业…

一文清晰了解CSS——简单实例

首先一个小技巧&#xff1a; 一定要学会的vsCode格式化整理代码的快捷键&#xff0c;再也不用手动调格式了-腾讯云开发者社区-腾讯云 (tencent.com) CSS选择器用于选择要应用样式的HTML元素。常见的选择器包括&#xff1a; 类选择器&#xff1a;以.开头&#xff0c;用于选择具…

STM32CubeMX 下载及安装教程

1. 什么是 STM32CubeMX? STM32CubeMX 是一款图形化的配置工具&#xff0c;用于配置 STM32 系列微控制器的硬件外设、时钟系统以及中间件组件。它提供了一种可视化的方式来设置硬件功能&#xff0c;并生成相应的初始化代码以帮助开发者快速启动项目。 2. 主要功能 2.1 图形化…

ISO三体系认证:助力企业迈向卓越管理

在激烈的市场竞争中&#xff0c;企业不仅需要优质的产品和服务&#xff0c;还需要科学高效的管理体系。ISO三体系认证&#xff0c;包括ISO 9001质量管理体系认证、ISO 14001环境管理体系认证和ISO 45001职业健康与安全管理体系认证&#xff0c;为企业提供了系统化的管理框架。这…

docker-compose安装rocketmq

创建挂载目录 mkdir -p /home/docker/rocketmq/rocketmq_server/logs mkdir -p /home/docker/rocketmq/rocketmq_broker/logs mkdir -p /home/docker/rocketmq/rocketmq_broker/store mkdir -p /home/docker/rocketmq/rocketmq_broker/conf#创建配置文件broker.conf cd /home/…

StarRocks 集群管理又添“猛将“ ,随配随用随时修改

前言 在存储业务数据时&#xff0c;StarRocks 存算分离支持使用各种外部独立存储系统。 在早期 3.0 版本中&#xff0c;用户需要在 fe.conf 中配置存储相关信息&#xff08;如 endpoint 等&#xff09;&#xff0c;这种静态配置模式也给用户使用带来了很多的不便性。 为此&a…

echarts中tooltip添加点击事件代码示例

echarts中tooltip添加点击事件代码示例_javascript技巧_脚本之家 点击事件无法使用this 或者 this无法使用&#xff1a;