数据结构算法--2 冒泡排序,选择排序,插入排序

news2024/10/6 6:04:13

  基础排序算法

        冒泡排序

思想就是将相邻元素两两比较,当一个元素大于右侧相邻元素时,交换他们的位置,小于右侧元素时,位置不变,最终序列中的最大元素,像气泡一样,到了最右侧。

012c2ec6bb0e46aea56ab0d18dfb1125.jpeg

 

这时冒泡排序第一轮结束,数列最右侧元素9的位置可认为是一个有序区,有序区目前有一个元素.

第二轮排序结束后,数列右侧的有序区有了两个元素.

8d36f60ad52745eeb86880d49d7f3a9a.jpeg

 由于该排序算法每一轮都要遍历所有元素,平均时间复杂度为O(n*n)

def bubble_sort(li):  
    for i in range(len(li)-1):  # 第i趟
        for j in range(len(li)-i-1):
            if li[j]>li[j+1]:   # 降序就改一下符号
                li[j],li[j+1]=li[j+1],li[j]   

li=[random.randint(1,100) for i in range(20)]
bubble_sort(li)
print(li)

如果在某一趟排序中列表没有发生变化,认为已经排好序,这时如果for循环遍历就极大浪费时间,我们可以加每一趟遍历前加一个标志位,在交换元素的代码处加一个修改标志位,这样就可以避免最坏情况出现.

def bubble_sort(li):
    for i in range(len(li)-1):
        exchange=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]
                exchange=True
        print(li)  # 看每一趟的变化
        if not exchange:
            return

        选择排序

基础思想为将列表中最小元素依次遍历筛选出来,最终得到一个有序列表

def select_sort_simple(li):
    li_new=[]
    for i in range(len(li)):   # 一共需要拿i次
        min_val=min(li)
        li_new.append(min_val)
        li.remove(min_val)
    return li_new

这个算法虽然简单但是浪费内存,我们可以在列表内部遍历,找到最小元素后与第一个元素交换位置,左侧有序区就有了第一个元素.

def select_sort(li):
    for i in range(len(li)-1):   # i趟,每次都把最小的放到前边交换
        min_loc=i   # 默认第一个最小,与后边遍历比较
        for j in range(i+1,len(li)):
            if li[j]<li[min_loc]:
                min_loc=j    # 目前的最小元素索引
        li[i],li[min_loc]=li[min_loc],li[i]
    return li

        插入排序

469efdd8a7d14de9a1a9dfc108f5d401.png

 

^ 初始时手里(有序区)只有一张牌(默认为元素第一个值)。

^ 每次从无序区(列表右侧区)摸一张牌(依次遍历),插入到有序区的正确(按大小)位置。

def insert_sort(li):
    for i in range(1,len(li)):  # 功n-1趟,i表示摸到牌的下标
        tmp=li[i]  # 每次摸的牌
        j=i-1      # 手里最右侧的
        while j>=0 and li[j]>tmp:    # 一直往左走
            li[j+1]=li[j]    # 右移
            j-=1
        li[j+1]=tmp   # 选好位置了

可以看出插入排序时间复杂度为O(n*n)

 

 

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

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

相关文章

vulnhub靶场之ADROIT: 1.0.1

准备&#xff1a; 攻击机&#xff1a;虚拟机kali、本机win10。 靶机&#xff1a;Adroit: 1.0.1&#xff0c;下载地址&#xff1a;https://download.vulnhub.com/adroit/Adroit-v1.0.1.ova&#xff0c;下载后直接vbox打开即可。 知识点&#xff1a;shell反弹&#xff08;jar&…

接口自动化必备技能——jmeter提取token方式以及设置成全局变量(跨线程组传token值)方式

前言 今天Darren洋教大家如何使用jmeter中的插件来进行token值的提取与调用&#xff0c;今天Darren洋介绍两种jmeter提取token值的方式&#xff0c;一种是在当前线程组中直接提取token值&#xff0c;一种是跨线程组的方式进行token值的提取并调用给不同线程组里的HTTP接口使用。…

LeetCode算法递归类—平衡二叉树

目录 110. 平衡二叉树 题解&#xff1a; 运行结果&#xff1a; 优化版1&#xff1a; 运行结果&#xff1a; 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度…

基于Bsdiff差分算法的汽车OTA升级技术研究(学习)

摘要 针对汽车OTA整包升级时&#xff0c;用户下载时间长&#xff0c;升级时间长&#xff0c;设备服务器端压力大等问题&#xff0c;本文提出了一种基于Bsdiff差分算法的汽车OTA升级技术。该算法能够对比新旧版本的差异&#xff0c;进行差分文件下载&#xff0c;减少软件包的下…

bat批处理启动jar包

echo off title “gwjy_sc(86)” java -jar -Xms512m -Xmx1024m -XX:MaxNewSize512m -XX:MaxPermSize512m gwjy_sc.jar --spring.config.localapplication.yml exit

Spring Bean的作用域和生命周期

文章目录 1. Bean的作用域2. Spring的生命周期3. Bean的生命周期4. 相关注解总结 1. Bean的作用域 Bean 的作用域指的是 Bean 在 Spring 容器中的行为&#xff08;Bean 实例创建及生命周期&#xff09;&#xff0c;它的行为是由 Spring 来管理的&#xff0c;可以根据具体情况选…

urllib爬虫模块

urllib爬取数据 import urllib.request as request# 定义url url "https://www.baidu.com" #模拟浏览器发起请求获取响应对象 response request.urlopen(url)""" read方法返回的是字节形式的二进制数据 二进制--》字符串 解码 decode( 编码的格式…

基于粒子群改进深度信念网络的回归分析,基于PSO-DBN的回归分析

目录 背影 DBN神经网络的原理 DBN神经网络的定义 受限玻尔兹曼机(RBM) 粒子群算法的原理 DBN的粒子群改进深度信念网络的回归分析 基本结构 主要参数 数据 MATALB代码 结果图 展望 背影 DBN是一种深度学习神经网络,拥有提取特征,非监督学习的能力,是一种非常好的分类算…

猿辅导《暑假一本通》:28天科学规划,帮助孩子保持学习状态

一直以来&#xff0c;有效利用寒、暑假期查漏补缺、解决偏科问题、初步养成好的自主学习习惯等是很多家长对学生的期望。但当前市面上教辅品类繁多&#xff0c;内容质量却参差不齐。据北京开卷统计数据显示&#xff0c;2022年前三季度零售市场上的教辅图书超过8000种&#xff0…

[NDK]从Opengles到Vulkan-基础篇(9)-视口相关

关于绘制调用的流程 我们可以看到整个流程步骤 1 光栅化2 裁剪测试3 多重采样4 深度测试5 模板测试6 混合7 抖动8 输出帧数据 这一节会涉及到裁剪测试 ##关于视口 我们需要先了解以下四个概念 1.屏幕:即计算机的整个屏幕大小。 2.窗口:即屏幕中的某一个窗口,可放大缩小和移…

通讯商二要素Api接口验证真伪

随着互联网的普及和各种社交平台、电商平台、金融平台的发展&#xff0c;许多业务都需要用户进行实名认证&#xff0c;这也就涉及到了手机号码和姓名的验证问题。为了解决这个问题&#xff0c;现在有很多运营商提供的二要素API接口能够进行手机号码和姓名的验证&#xff0c;本文…

使用Pandas进行数据清理的入门示例

数据清理是数据分析过程中的关键步骤&#xff0c;它涉及识别缺失值、重复行、异常值和不正确的数据类型。获得干净可靠的数据对于准确的分析和建模非常重要。 本文将介绍以下6个经常使用的数据清理操作&#xff1a; 检查缺失值、检查重复行、处理离群值、检查所有列的数据类型…

Qt打包程序 windeployqt

Qt Creator运行直接生成的可执行性程序不能直接使用&#xff0c;原因是缺少依赖库。直接运行会报错&#xff1a; 为可执行文件添加图标 为可执行文件添加 icon 图标的方法很简单&#xff0c;将事先准备好的 icon 图标拷贝到程序对应的文件夹中&#xff0c;然后在 pro 工程文…

Java课题笔记~ JSTL

使用EL表达式已经实现了页面输出显示的优化&#xff0c;为什么还需要使用JSTL呢&#xff1f; 这是因为使用EL表达式无法实现逻辑处理&#xff0c;如循环、条件判断等&#xff0c;因此还需要与Java代码混合使用&#xff0c;而JSTL则可以实现逻辑控制&#xff0c;从而进一步优化…

中小企业选择Zoho CRM的五大优点

一款适用于中小企业的CRM客户关系管理软件&#xff0c;它可以帮助企业提高销售效率&#xff0c;改善营销效果&#xff0c;优化业务流程&#xff0c;实现业绩增长。下面说说&#xff0c;中小企业为什么要选择Zoho CRM&#xff1f; 1、多种版本定价 CRM需要提供了多种定价方案&…

三相电机的烧毁原因以及如何保护

三相电动机&#xff0c;具有一定的过载能力&#xff0c;短时间过载对电动机的影响不大&#xff0c;但是&#xff0c;电动机的电流长时间超过额定电流&#xff0c;就会使电动机严重发热而损坏&#xff0c;如果电动机定子绕组内部发生短路&#xff0c;也会使绕组电流增加而烧毁电…

07 - 深入浅出HashMap的设计与优化

在上一讲中提到过 Collection 接口&#xff0c;那么在 Java 容器类中&#xff0c;除了这个接口之外&#xff0c;还定义了一个很重要的 Map 接口&#xff0c;主要用来存储键值对数据。 HashMap 作为我们日常使用最频繁的容器之一&#xff0c;相信你一定不陌生了。今天我们就从 …

Java SpringBoot Vue智能停车系统

基础环境 JDK1.8、Maven、Mysql、IntelliJ IDEA 内置功能 系统管理&#xff1a;角色管理、接口管理、系统菜单、全局配置 账号管理&#xff1a;用户管理、合作单位 系统监控&#xff1a;监控大屏、日志监控 财务管理&#xff1a;订单列表 停车记录&#xff1a;停车记录 车辆管…

再不学就晚了!学习嵌入式的五个好处

学习嵌入式技术带来的好处不仅限于提高就业竞争力&#xff0c;还能为你提供其他各种各样的潜在优势。种一棵树最好的时间是十年前&#xff0c;其次就是现在&#xff0c;是时候立刻开始学习嵌入式技术了&#xff01; 1. 多样的就业机会 嵌入式技术已经广泛应用于各行各业&#x…

基于STM32CUBEMX驱动TMOS模块STHS34PF80(4)----中断获取信号

基于STM32CUBEMX驱动TMOS模块STHS34PF80----4.中断获取信号 概述样品申请视频教程参考Demo参考程序中断中断生成设置中断开启存在检测中断输出配置中断管脚主程序测试结果 概述 HS34PF80的数据准备信号提供了一种机制&#xff0c;允许设备在新的测量数据可读取时通知系统&…