03_1排序算法:冒泡排序、选择排序、插入排序

news2024/11/25 16:43:15

 开始系统学习算法啦!为后面力扣和蓝桥杯的刷题做准备!这个专栏将记录自己学习算法是的笔记,包括概念算法运行过程,以及代码实现,希望能给大家带来帮助,感兴趣的小伙伴欢迎评论区留言或者私信博主哦!今天更新的是《03_1排序算法:冒泡排序、选择排序、插入排序》

目录

冒泡排序概念

        运作过程

        算法分析

        代码实现

选择排序概念

        排序过程

        时间复杂度

        代码实现

插入排序概念

        算法过程

        时间复杂度

        代码实现

 总结


冒泡排序概念

冒泡排序(Bubble Sort)是一种简单的排序算法。它重复的遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作室重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小(越大)的元素会慢慢“浮到”数列的顶端。

运作过程

  • 比较相邻的元素,如果第一个比第二个大(升序),就交换他们两个。
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完之后,最后的元素会是最大的数。
  • 针对所有的元素重复以上的步骤,除了最后一个。
  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

算法分析

时间复杂度

  • 最优时间复杂度:O(n) 表示遍历一次发现没有任何可以交换的元素,排序结束。
  • 最坏时间复杂度:O(n^2)每一个都要交换
  • 稳定性:稳定

代码实现

def bubble_sort_1(alist):
    """
    两个for循环嵌套
    以 alist = [1,3,2,5,7,6,4]为例
    第一次需要遍历到索引6,第二次5,直到索引0
    :param alist:
    :return:alist:list
    """
    for k in range(0,len(alist)-1):
        for i in range(0,len(alist)-1-k):
            if alist[i] > alist[i+1]:
                alist[i],alist[i+1] = alist[i+1],alist[i] # 实现升序排列
    return alist
def bubble_sort_2(alist):
    """
    while循环+for循环嵌套
    以 alist = [1,3,2,5,7,6,4]为例
    主要是k的值的变化
    :param alist:
    :return:alist:list
    """
    k = 0
    while k != len(alist)-1:
        k += 1
        for i in range(0,len(alist)-k):
            if alist[i] > alist[i+1]:
                alist[i],alist[i+1] = alist[i+1],alist[i] # 实现升序排列
    return alist
def bubble_sort_3(alist):
    """
    while循环+for循环嵌套
    以 alist = [1,3,2,5,7,6,4]为例
    如果遍历的时候没有发现要交换的,则这个列表已经是一个排好序的,则直接break
    :param alist:
    :return:alist:list
    """
    for k in range(0,len(alist)-1):
        count = 0
        for i in range(0,len(alist)-1-k):
            if alist[i] > alist[i+1]:
                count += 1
                alist[i],alist[i+1] = alist[i+1],alist[i] # 实现升序排列
        if count == 0:
            break
    return alist

在这个优化里面只有当遍历完之后发现所有的都不需要操作的时候才会break,所以它的最乐观的时间复杂度还是O(n),最差的时间复杂度还是O(n^2),只在特定的情况下才会有优化的效果。我也尝试着用time模块的time.time()函数来获取程序运行的时间 ,但是程序运行的时间太短了,最终都显示0.0,我也懒得去增大列表的长度了(狗头)。


选择排序概念

选择排序Selection sort)是一种简单直观的排序算法。它的工作原理如下:

  • 首先在未排序序列中找到最小(大)元素,存放在排序序列的起始位置,即第一个位置。
  • 然后再将剩余未排序元素中继续寻找最小(最大)元素,放在第二个位置。
  • 以此类推,直到所有元素均排序完毕。

总结:先找出最大(最小)的元素,放在第一位或者最后一位。以找出最大的放在第一位为例,先找出最大的放在第一位,再在剩下的元素找出最大的元素,放在第二位,依次进行,直到遍历到最后一个元素,排序结束。选择选的就是最大或者最小的的,相当于挑高个,挑完最高的,再挑次高的,直到结束。

排序过程

时间复杂度

最优时间复杂度:O(n^2)

最坏时间复杂度:O(n^2)

稳定性:不稳定(考虑升序每次选择最大的情况)

代码实现

def selection_sort(alist):
    """
    :param alist:
    :return: alist
    思想就是不断找出最小的放在最前面
    以alist = [10,1,3,2,5,7,6,4]为例,n=8
    第一次是把1放在最前面
    """
    n = len(alist)  # 8
    for i in range(n): # 0-7
        # 下面一段代码是为了找到最小值
        min_index = i
        for j in range(i,n): #0-7
            if alist[min_index] > alist[j]:
                min_index = j
        # 下面一段代码是为了交换最小值
        if min_index != i:
            alist[i],alist[min_index] = alist[min_index],alist[i]

    return alist

程序可以看成两段,一段是找到剩下里面最小的元素一段是交换最小值,这两步就可以完成排序,时间复杂度为O(n^2),注意写代码的时候,这两段要分开写,思路更加清晰一些,注意索引的值,可以代入最小时和最大时去检验,这样可以有效避免索引出错。


插入排序概念

插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应的位置并插入。插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

算法过程

时间复杂度

  • 最优时间复杂度:O(n) (升序排列,序列已经处于升序状态)
  • 最坏时间复杂度:O(n^2)
  • 稳定性:稳定

代码实现

def insert_sort(alist):
    """
    :param alist:
    :return: alist.sort
    插入排序首先需要认定一个基准,一般认为是第一个
    以alist = [10,1,3,2,5,7,6,4]为例,首先是1和10比较,需要交换,此时i=0,递减变为-1退出while循环
    列表变为alist = [1,10,3,2,5,7,6,4],首先是3和10比较,需要交换,再和1比较,不需要交换,直到i递减到比0小,退出循环
    列表的每一个元素都要这么操作,所以外层还要嵌套一个for循环去便利每一个元素
    """
    for i in range(1,len(alist)):
        while i > 0:
            if alist[i-1] > alist[i]:
                alist[i-1],alist[i] = alist[i],alist[i-1]
            else:
                break
            i -= 1
    return alist

 总结

比较一下排序:

从算法实现上来分别比较:

  • 冒泡排序是两两比较,分为升序冒泡排序,降序冒泡排序。区别就在于上浮的是大的数还是小的数,其原理都是一样的。冒泡排序的算法实现可以总结成一句话:重复的遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。时间复杂度为O(n^2)
  • 选择排序是不断找最大或者最小的元素,将它放在头或者尾,以找出最大的放在第一位为例,先找出最大的放在第一位,再在剩下的元素找出最大的元素,放在第二位,依次进行,直到遍历到最后一个元素,排序结束。选择选的就是最大或者最小的的,相当于挑高个,挑完最高的,再挑次高的,直到结束。
  • 插入排序工作原理总结成一句话:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应的位置并插入。插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

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

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

相关文章

专访 | 刘乔升:开源是人类智力劳动最好的组织形式

OpenMLDB: 可以请你先自我介绍一下吗? 刘乔升: 我叫刘乔升,来自复旦大学,就读于软件工程专业,是 2022 开源之夏 OpenMLDB Go SDK 项目的贡献者。在参加本届开源之夏活动前,我就有参加过一些开源…

自定义maven骨架

目录 一、自定义maven骨架 1、先创建一个新的工程、添加你需要的结构目录及pom所需要的依赖文件,以这个工程为模板,创建框架 2、添加在pom文件中添加依赖,com.test文件中这个坐标与maven仓库相对应 3、点击Edit....会有一个弹窗 4、点击加…

如何在SpringBoot中设置HTTP缓存,你知道么?

在工作之余阅读缓存相关的书籍时,看到了http缓存相关的知识,HTTP 缓存机制是一个 web 性能优化的重要手段,无论是做前端还是做web后台,都可能会用得到它,应该是知识体系库中的一个基础环节,以前这一块学的不…

TAPD新增需求自动写入腾讯文档

【实现效果:】TAPD新增需求/缺陷,可以自动写入腾讯文档智能表,方便通过腾讯文档灵活管理自己的项目排期,并且通过不同的视图效果,实现简单的需求统计/分组迭代,通过数据关联及时跟进延期项目。 【准备工作…

引用类型 - JavaScript 数组对象、遍历、复制、冒泡排序、选择排序、数组方法、数组去重

写在前面 哎呀呀,每次都是要沉淀好久好久才能更一篇文章…基本上半个月都很难出一篇,但还是想把这个系列做起来,主要是为了记录自己学习和开发的过程,以便在面试的时候讲项目,能说得头头是道(◍•ᴗ•◍) 马上就要开…

Clickhouse

目录 Clickhouse简介 整体架构 数据接入层 数据存储层 数据服务层 数据应用层 Clickhouse简介 目前企业用户行为日志每天百亿量级,虽然经过数仓的分层以及数据汇总层通用维度指标的预计算,有些个性化的分析场景还是需要直接编写程序或sql查询&…

python人工智能学习需要学什么?

前言 如果要从科技领域找出最大的变化和革新,那么我们很难不说到“人工智能”这个关键词。人工智能催生了大量新技术、新企业和新业态,为个人、企业、国家乃至全球提供了新的经济增长点,上到谷歌、苹果、百度等巨头,下到各类创业…

发布-订阅模式解读

发布-订阅模式 先简单说一下发布订阅模式各个组件的定义: 发布者 Publisher : 状态改变时 , 向 消息中心 发送事件 ; 订阅者 Subscriber : 到 消息中心 订阅自己关心的事件 ; 消息中心 : 负责维护一个 消息队列 , 根据 消息类型 将 消息 转发给 对应的 订阅者 ; 下面按照该…

差错控制方法----循环冗余码计算

差错控制方法----循环冗余码计算 循环冗余码,又称为多项式码。CRC的工作方法是在发送端产生一个冗余码,附加在信息位后面一起发送到接收端,接收端收到的信息按发送端形成循环冗余码同样的算法进行校验,如果发现错误,则…

(附源码)php校园电子图像信息采集系统 毕业设计 010930

目 录 摘要 1 1 绪论 1 1.1 研究背景 1 1.2研究内容 1 1.3论文结构与章节安排 1 2 校园电子图像信息采集系统 系统分析 3 2.1 可行性分析 3 2.2 系统流程分析 3 2.2.1 数据增加流程 3 2.2.2 数据修改流程 4 2.3.3数据删除流程 4 2.3 系统功能分析 4 2.3.1 功能性分析 4 2.3.2 …

多态——C++第三大特性

目录 一、多态的概念 1、概念 二、多态的定义及实现 1、构成条件 2、虚函数 3、虚函数的重写 4、C11提供了override和final两个关键字,可以帮助用户检测是否重写 5、重载、覆盖(重写)、隐藏(重定义)的对比 三、…

pytorch环境配置

pytorch环境配置pytorch环境配置1.NVIDIA驱动安装与更新1.查看自己的电脑显卡版本2.下载显卡驱动3.安装与验证2.pytorch环境安装1.打开anaconda的终端2. 创建虚拟环境3.换源4.安装5.验证3.pycharm项目的pytorch环境设置pytorch环境配置 使用Anacondapycharm搭建pytorch环境 提…

常见的四大搜索引擎区别

一般应用或网站的信息会存储在数据库中,而随着时间的推移,数据库中的信息量达到一个量级后会出现访问速度变慢的情况,例如用户在客户端搜索一个商品名称,系统可能加载了好几秒才显示数据,这个时候就需要进行一些优化处…

ET框架(三)

Model》数据 HotFix》行为 ET框架中的ECS和Unity的ECS无关 hotfix 静态类静态方法>行为 可以控制组件 Model》数据 继承Entity IAwake初始化 Scene实体的子实体类型 特殊: Unity.hotfixView : Unity相关的行为 Unity .modeView: Unity相关的数据 代码公用&a…

WSL_01 Windows WSL 安装并配置镜像与SSH

文章目录1 WSL介绍2 安装步骤2.1 启用适用于 Linux 的 Windows 子系统2.2 检查运行 WSL 2 的要求2.3 启用虚拟机功能2.4 下载 Linux 内核更新包2.5 将 WSL 2 设置为默认版本2.6 安装所选的Linux 分发解决无法打开微软商店2.6.1 配置网络2.6.2 使用官方教程的链接2.6.3 使用命令…

Redis实战——达人探店

目录 1、发布笔记 1.1 上传图片 1.2. 发表博文功能: 2. 查看探店笔记 3. 点赞功能的实现 4. 点赞排行榜的实现 1、发布笔记 笔记类似点评网站的评价,往往是图文结合。 对应的表有两个 tb_blog:探店笔记表,包含笔记中的…

java计算机毕业设计springboot+vue高校本科学生综评系统

项目介绍 通篇文章的撰写基础是实际的应用需要,然后在架构系统之前全面复习大学所修习的相关知识以及网络提供的技术应用教程,以远程教育系统的实际应用需要出发,架构系统来改善现高校本科学生综评系统工作流程繁琐等问题。不仅如此以操作者的角度来说,该系统的架构能够对多媒…

网络流量回溯分析助力企业实现高效率运维(二)

背景 汽车配件电子图册系统是某汽车集团的重要业务系统。业务部门反映,汽车配件电子图册调用图纸时,出现访问慢现象。 某汽车总部已部署NetInside流量分析系统,使用流量分析系统提供实时和历史原始流量。本次分析重点针对汽车配件电子图册系…

在Python里使用ChatGPT

前言 近来chatGPT挺火的,也试玩了一下,确实挺有意思。这里记录一下在Python中如何去使用chatGPT。 本篇文章的实现100%基于 chatGPT,我是搬运工无疑了!!! 本片文章比较简单,下一篇基于本文章来写…

景联文科技:推动智慧医疗进程,浅谈运用到的数据标注技术

“近年来,人工智能蓬勃发展,不断赋能医疗健康领域,改善患者的就医体验,有效提高医疗质量。智能医疗的实现需要许多专业且精准的标注数据不断对智慧医疗技术中包含的算法模型进行训练调优。” 从2015年至今,我国急性脑梗…