算法学习笔记(4)-基础排序算法

##O(n^2)算法时间复杂度的排序算法

目录

##O(n^2)算法时间复杂度的排序算法

##选择排序

##原理

##图例

##代码实现示例

##冒泡排序

##原理

##图例

##代码实现示例

##插入排序

##原理

##图例

##代码实现示例

##总结 


##选择排序

##原理

在一个无序的数组或者列表中,从第一个元素到最后一个元素中选择一个最小的元素与第一个元素进行交换,即第一个元素位置就变成了有序区域,而对于无序区域重复以上过程,一个完整的选择排序就实现完成了。

##图例

##代码实现示例

#python代码示例
def SelectionSort(ls) :
    n = len(ls)
    #这里为什么是n-1呢这里说明一下
    #我们要进行n-1轮的选择
    for i in range(n-1) :
        min = i #设置当前位置为最小值
        for j in range(i+1,n) : #从当前位置开始到最后一个位置进行选择
            if ls[j] < ls[min] :
                min = j
        ls[min],ls[i] = ls[i],ls[min]
        print(ls) #查看每一轮的选择结果,便于理解
ls = [2,3,4,5,1,1]
SelectionSort(ls)

//c++代码示例
void selection_sort(vector<int> &a)
{
    int n = a.size() ;
    for (int i = 0 ; i < len - 1 ; i++)
    {
        int min = i ;
        for (int j = i + 1 ; j < len ; j++)
        {
            if (a[j] < a[min])
            {
                min = j ; //记录最小元素的索引
            }
        }
        if (min != i) //交换操作,也可以利用swap函数 swap(a[i],a[min])
        {
            int temp = a[min] ;
            a[min] = a[i] ;
            a[i] = temp ;
        }
    }
}

##冒泡排序

##原理

通过连续地比较与交换相邻元素实现排序。这个过程就像气泡从底部升到顶部一样,因此得名冒泡排序。(不仅仅可以实现递增顺序,同样也可以实现递减顺序),每一次循环都会形成一个有序区域和无序区域。

##图例

##代码实现示例

//c++代码示例
void bubble_sort(vector<int> &nums)
{
    int n = nums.size() ;
    //外循环未排序的区域为[0,i]
    for (int i = n - 1 ; i > 0 ; i--)
    {
        //内循环,将未排序的区域[0,i]中的最大元素交换至区间的最右端
        for (int j = 0 ; j < i ; j++)
        {
            if (nums[j+1] < nums[j])
            {
                //可以使用std::swap()函数,进行交换
                int temp = nums[j+1] ;
                nums[j+1] = nums[j] ;
                nums[j] = temp ;
            }
        }
    }
}
def BubbleSort(ls):
    n = len(ls)
    for i in range(n-1,0,-1) : #这里说明以下为什么不是range(n-1,-1,-1),因为自己不需要和自己比较
        for j in range(i) :
            if ls[j] > ls[j+1] :
                ls[j],ls[j+1] = ls[j+1],ls[j]
        print(ls) #查看交换结果,便于理解整个过程
        

##插入排序

##原理

我们在未排序区间选择一个基准元素,将该元素与其左侧已排序区间的元素逐一比较大小,并将该元素插入到正确的位置。

我们将基准元素作为一个有序区,然后遍历无序区将无序区的元素插入到有序区域的适合位置。

##图例

##代码实现示例

1

def InsertSort(ls) :
    n = len(ls)
    for i in range(1,n) : #选取第一个元素为基准值,循环下标从1开始
        x = ls[i] #记录未排序区间的待插入元素
        j = i - 1 #遍历有序区域,找到待插入的位置
        while j >= 0 : 
            if x <= ls[j] : #若待插入元素小于当前有序区的元素,有序区元素后移一位
                ls[j+1] = ls[j]
            else :
                break
            j -= 1
        ls[j+1] = x #将元素插入到指定位置
        print(ls) #查看每一步的插入

3

void bubble_sort(vector<int> &nums)
{
    int n = nums.size() ;
    for (int i = 1 ; i < n ; i++)
    {
        base = nums[i] ;
        j = i - 1 ;
        while (j >= 0 && base < nums[j])
        {
            nums[j+1] = nums[j] ; 向右移动一位
            j-- ;
        }
        nums[j+1] = base ; 
    }
}

##总结 

  • 冒泡排序基于元素交换实现,需要借助一个临时变量,共涉及 3 个单元操作;插入排序基于元素赋值实现,仅需 1 个单元操作。因此,冒泡排序的计算开销通常比插入排序更高
  • 选择排序在任何情况下的时间复杂度都为 𝑂(n^2) 。如果给定一组部分有序的数据,插入排序通常比选择排序效率更高
  • 选择排序不稳定,无法应用于多级排序。

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

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

相关文章

使用Xshell工具连接ubuntu-方便快捷

使用Xshell连接ubuntu 在命令行输入 “sudo apt-get install openssh-server”安装openssh-server 开启 ssh-server&#xff0c;在命令行输入 “service ssh start”&#xff0c;然后输入密码即可

浅谈SiC MOSFET之双脉冲原理

1.双脉冲实验实验的必要性 在平常的使用中&#xff0c;我们基本通过芯片手册来了解功率器件的各种性能参数&#xff0c;但是手册中的参数的测量环境都是在理想状态下&#xff0c;与实际使用或多或少都会有差别。通过双脉冲实验可以获取器件在真实工况下的参数&#xff0c;对于产…

如何在创建之前检测 Elasticsearch 将使用哪个索引模板

作者&#xff1a;来自 Elastic Musab Dogan 概述 Elasticsearch 提供两种类型的索引模板&#xff1a;旧&#xff08;legacy&#xff09;索引模板和可组合 (composable) 索引模板。 Elasticsearch 7.8 中引入的可组合模板旨在替换旧模板&#xff0c;两者仍然可以在 Elasticsear…

ArcGIS软件损坏怎么修复?10.7分享

前言 我们经常ArcGIS用着用着就会出现一些莫名奇怪的情况&#xff0c;比如ArcGIS的工具箱都打&#xff0c;字体丢失等、dll文件缺失。尝试了很多方法之后没有效果的&#xff0c;我们可以对软件做修复 那么修复改如果做呢&#xff1f; 不需要卸载软件&#xff0c;直接安装deskt…

记录一下 log4j的漏洞

目录 背景 bug的产生 bug复现 JNDI 网络安全学习路线 &#xff08;2024最新整理&#xff09; 学习资料的推荐 1.视频教程 2.SRC技术文档&PDF书籍 3.大厂面试题 特别声明&#xff1a; 背景 log4j这次的bug&#xff0c;我相信大家都已经知道了&#xff0c;仅以…

【异常】SpringBoot整合RabbitMQ-发送消息报错

错误信息 reply-code406, reply-textPRECONDITION_FAILED - inequivalent arg ‘x-message-ttl’ for queue ‘hello-queue’ in vhost ‘/lq’: received none but current is the value ‘10000’ of type ‘signedint’, class-id50, method-id10 错误原因 hello-queue这…

【每日刷题】Day39

【每日刷题】Day39 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 622. 设计循环队列 - 力扣&#xff08;LeetCode&#xff09; 2. 387. 字符串中的第一个唯一字符 - …

一觉醒来 AI科技圈发生的大小事儿 05月13日

&#x1f4f3;博弈论让 AI 更加正确、高效&#xff0c;LLM 与自己竞争 研究团队设计了共识博弈&#xff0c;通过让语言模型的生成器和判别器相互博弈来提高模型的准确性和内部一致性。这种方法不需要对基础模型进行训练或修改&#xff0c;可以在笔记本电脑上快速执行。研究结果…

《云原生安全攻防》-- 构建云原生攻防场景

在本节课程中&#xff0c;我们将学习云原生攻防场景的构建。为了研究云原生安全攻击案例&#xff0c;我们需要搭建一个云原生攻击测试环境&#xff0c;以便进行攻防研究和攻击手法的复现。 在这个课程中&#xff0c;我们将学习以下内容&#xff1a; 构建云原生攻防场景&#xf…

绝地求生:艾伦格回归活动来了,持续近1个月,新版本皮肤、G币等奖励白嫖

嗨&#xff0c;我是闲游盒~ 29.2版本更新在即&#xff0c;新活动来啦&#xff01;目前这个活动国内官方还没发&#xff0c;我就去台湾官方搬来了中文版方便大家观看&#xff0c;也分析一下这些奖励应该怎样才能获得。 新版本将在周二进行约9小时的停机维护&#xff0c;请注意安…

基于WTVxxx语音芯片方案在智能小家电领域的应用介绍

一、产品市场&#xff1a; WTVxxx系列语音芯片凭借其出色的性价比&#xff0c;在小家电制造业中脱颖而出&#xff0c;它在确保优异音质及全面功能的基础上&#xff0c;大幅度削减了生产成本&#xff0c;为产品在激烈的市场竞争中赢得了价格优势&#xff0c;并为制造商拓宽了盈利…

快速清理系统盘空间

占用系统盘资源比较大&#xff0c;有两种log与cache。 使用如下命令查看 du -h /var/cache --max-depth1 | sort -hr | head -n 10结果如下&#xff1a;

【Java应用】Java提取B站视频教程详情(完整代码|下载可直接运行|自带页面|可直接复制)

提取B站视频教程详情 背景 B站这个视频列表是真的体验感太差了,有时候想把章节复制下来,再对应的章节下面做笔记,实在是太难搞了,于是就有了这篇文文章 效果图 根据关键字获取视频id public Result videoList(RequestBody VideoDto videoDto) {String keyword videoDto.get…

pcdn边缘云常见sla有哪些?如何避免被白嫖

PCDN&#xff08;Point-to-Point Content Delivery Network&#xff09;边缘云常见的SLA&#xff08;Service Level Agreement&#xff09;规则包括高峰期离线、服务时间、重传延时、限速等。这些规则是为了保证服务质量和用户体验。下面将详细解释这些规则&#xff0c;并提供一…

微服务熔断降级

什么是熔断降级 微服务中难免存在服务之间的远程调用&#xff0c;比如&#xff1a;内容管理服务远程调用媒资服务的上传文件接口&#xff0c;当微服务运行不正常会导致无法正常调用微服务&#xff0c;此时会出现异常&#xff0c;如果这种异常不去处理可能导致雪崩效应。 微服…

RabbitMQ--死信队列

目录 一、死信队列介绍 1.死信 2.死信的来源 2.1 TTL 2.2 死信的来源 3.死信队列 4.死信队列的用途 二、死信队列的实现 1.导入依赖 pom.xml 2.application.properties 3.配置类 4.生产者 5.业务消费者&#xff08;正常消费者&#xff09; 6.死信队列消费者 一、…

机器人系统ros2-开发学习实践11-从零开始构建视觉机器人模型(urdf)(02)

接上一个教程继续完善&#xff0c; 我们需要对机器人身体的蓝色&#xff0c;我们定义了一种名为“蓝色”的新材质&#xff0c;其中红色、绿色、蓝色和 alpha 通道分别定义为 0、0、0.8 和 1。所有值都可以在 [0,1] 范围内。然后该材料由 base_link 的视觉元素引用。白色材料的…

【LangChain学习之旅】—(21)聊天客服机器人的开发(上)

【LangChain学习之旅】—(21)聊天客服机器人的开发(上) “聊天机器人”说明项目的技术实现细节技术实现步骤简述第二步:增加记忆机制第三步:增加检索机制总结“聊天机器人”说明 聊天机器人(Chatbot)是 LLM 和 LangChain 的核心用例之一,很多人学习大语言模型,学习 …

GRE over IPsec VPN实验

一、拓扑图 二、组网需求 某企业总部、分支1、分支2分别通过 R1&#xff0c;R3&#xff0c;R4 接入互联网&#xff0c;配置默认路由连通公网按照图示配置 IP 地址&#xff0c;R1&#xff0c;R3&#xff0c;R4 分别配置 Loopback0 口匹配感兴趣流&#xff0c;Loopback1 口模拟业…