首页 > 其他分享 >冒泡排序——超详细解释

冒泡排序——超详细解释

时间:2024-11-05 22:19:41浏览次数:4  
标签:解释 元素 交换 len li range 循环 冒泡排序 详细

 一、什么是冒泡排序?

1、就是相邻的比较大小,然后交换位置,比如【1,3,2,4】(小放前,大放后)。

2、那1跟3比较,不需要交换;3跟2比较,交换;此时更新了列表[1,2,3,4];3跟4比较,不交换。

3、4后面没有值了,我们不需要再一次比较。

二、代码解析

1、可以看到长度是8,但我们-1变成7躺,就少一次循环,优化代码

def mpa_px(li):
    for i in range(len(li)-1):                  # 第i躺,为什么不是len(li)躺,因为最后第二趟已经排序好了,所以直接-1,当然也可以是len(li),就会多走一趟
        for j in range(len(li)-i-1):            # 无序列表范围、指针移动
            if li[j]>li[j+1]:                   # 前一个大于后面一个进入交换
                li[j],li[j+1] = li[j+1],li[j]
        print(li)

lis = [2,3,4,5,7,8,6,1]
mpa_px(lis)

2、内层循环

for j in range(len(li)-i-1):

这个内层循环的目的是在当前趟中,从未排序的部分找到最大的元素并将其放到正确的位置。让我们分解一下这个循环的范围:

  1. len(li)-i-1:
    • len(li) 是列表的长度。
    • i 是当前外层循环的索引,表示已经排好序的元素个数。
    • len(li)-i-1 表示在当前趟中需要比较的元素个数。因为前 i 个元素已经在前面的趟次中排好序了,所以剩下的未排序元素个数就是 len(li)-i-1

举个例子,假设列表长度为5(即 len(li) = 5),那么:

  • 在第1趟(i=0)中,内层循环的范围是 range(5-0-1),即 range(4),也就是 [0, 1, 2, 3]。这表示我们需要比较第0到第3个元素。
  • 在第2趟(i=1)中,内层循环的范围是 range(5-1-1),即 range(3),也就是 [0, 1, 2]。这表示我们只需要比较第0到第2个元素,因为第3和第4个元素已经在第1趟中排好序了。

3、比较和交换

在内层循环中,每一对相邻的元素都会被比较,如果顺序错误(即前一个元素大于后一个元素),它们的位置就会被交换:

if li[j] > li[j+1]:

     li[j], li[j+1] = li[j+1], li[j]

三、代码结果 

四、优化冒泡排序 

我们从上面可以看出上面的做法时间复杂度是O(n**2),但我们可以优化不必要的次数

def mpa_px(li):
    for i in range(len(li)-1):                  # 第i躺,为什么不是len(li)躺,因为最后第二趟已经排序好了,所以直接-1,当然也可以是len(li),就会多走一趟
        exec = False
        for j in range(len(li)-i-1):            # 无序列表范围、指针移动
            if li[j]>li[j+1]:                   # 前一个大于后面一个进入交换
                li[j],li[j+1] = li[j+1],li[j]
                exec = True
        print(li)
        if not exec:
            return


lis = [1,2,4,3,5,7,6]
mpa_px(lis)

标签:解释,元素,交换,len,li,range,循环,冒泡排序,详细
From: https://blog.csdn.net/CNY8888/article/details/143467226

相关文章

  • python转义字符(小白详细解答)
    python转义字符(详细解答)小白初来乍到,请多多关照,如发现文章中有错误请及时提醒,进行修改转义字符是字符串中拥有特殊功能的字符,在字符串中不会显现出来,而是表示特殊功能的字符1.1换行符\n:换行符,将一串字符串进行分割并换行print("1.换行符:""abcd\na1b1c1d1") #1.换......
  • src-api 详细说明
    这段代码展示了一个名为getList的导出函数,该函数用于发送HTTPGET请求获取列表数据。以下是对其各部分的详细分析:导入语句importrequestfrom'@/utils/request/request';这条语句从指定的路径'@/utils/request/request'导入了一个名为request的模块。这个模块很可......
  • springboot+vue乘客电梯无纸化维保系统功能详细【开题+程序+论文】
    系统程序文件列表开题报告内容研究背景随着城市化进程的加速,高层建筑如雨后春笋般涌现,乘客电梯作为现代生活中不可或缺的垂直交通工具,其安全性能和运行效率直接关系到公众的生命安全与生活质量。传统的电梯维保模式依赖于纸质记录,不仅效率低下,且易产生数据错漏,难以实现对电......
  • 浏览器中输入URL返回页面过程(超级详细)、DNS域名解析服务,TCP三次握手、四次挥手
    文章目录前言浏览器中输入URL返回页面全过程DNS域名解析过程TCP的三次握手、四次挥手一、浏览器中输入域名二、解析域名2.1具体过程2.2知识补充2.2.1域名体系结构2.2.2查询方式——递归查询、迭代查询2.2.3DNS域名解析过程三、浏览器与目标服务器建立T......
  • 大模型技术学习过程详细梳理,收藏我这一篇就够了!!!
    学习大模型技术也有几个月的时间了,之前的学习一直是东一榔头,西一棒槌,这学一点那学一点,虽然弄的乱七八糟,但对大模型技术也算有了一个初步的认识。前排提示,文末有大模型AGI-CSDN独家资料包哦!因此,今天就来整体梳理一下大模型技术的框架,争取从大模型所涉及的理论,技术,应用等多......
  • 全网最详细大语言模型(LLM)入门学习路线图
    Github项目上有一个大语言模型学习路线笔记,它全面涵盖了大语言模型的所需的基础知识学习,LLM前沿算法和架构,以及如何将大语言模型进行工程化实践。这份资料是初学者或有一定基础的开发/算法人员入门活深入大型语言模型学习的优秀参考。这份资料重点介绍了我们应该掌握哪些核......
  • 关于LIME(局部可解释模型无关解释)和SHAP(SHapley Additive exPlanations)的具体应用案例
    关注我,持续分享逻辑思维&管理思维&面试题;可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;推荐专栏《10天学会使用asp.net编程AI大模型》,目前已完成所有内容。一顿烧烤不到的费用,让人能紧跟时代的浪潮。从普通网站,到公众号、小程序,再到AI大模型网站。干货满满。学成后可......
  • 冒泡排序与选择排序超详细讲解
    冒泡排序与选择排序冒泡排序condition:输入5个数字,冒泡排序,逆序输出#include<stdio.h>intmain(){ intuserInput,tmp,i,j,arr[6],flag; flag=0; for(inti=0;i<5;i++){ scanf("%d",&userInput); arr[i]=userInput; }//依次输入五个数字 for(inti=0;i<4;i++){//......
  • [JAVA]‘==‘和‘equals()‘的区别------详细解读版本
    1.'=='操作符什么是'=='?== 是Java中的比较操作符,用于比较两个变量或对象的内存地址或数值。基本数据类型:== 用于比较变量的数值是否相等。引用数据类型:== 用于比较两个对象的引用地址是否相同,判断它们是否指向同一个对象。示例1:== 比较基本数据类型inta=5;int......
  • 为什么程序员35岁就会被淘汰(非常详细)看这一篇就够了
    文章目录前言一、为何程序员35岁就开始被嫌弃了?1、技术更新迅速2、职业发展瓶颈3、成本考虑4、年龄歧视5、市场供需变化6、个人因素二、程序员该如何避免中年危机?1、持续学习与技能更新2、拓展技术广度与深度3、提升软技能4、关注行业趋势与市场变化5、建立人脉与社交网......