排序算法:【选择排序]

一、选择排序——时间复杂度O(n^{2})

定义:第一趟排序,从整个序列中找到最小的数,把它放到序列的第一个位置上,第二趟排序,再从无序区找到最小的数,把它放到序列的第二个位置上,以此类推。

        也就是说,首先从序列中找到最小的元素,放到有序区的第一个位置上,然后再从剩下的无序区中,继续找最小的元素,放到有序区的末尾。

1、容易想到的方法——不推荐

        新建一个空列表,然后每遍历一次老列表时候,就把一个最小值,放到新列表里,同时再把这个值从老列表里删除掉。

但这种方法有两个缺点:

(1)额外占内存。因为新建了一个空列表 l1,所以就会多占用一个内存空间。

(2)时间复杂度高,排序效率慢。

        列表的增加和删除方法,时间复杂度都是O(n)。

        原因:把最小值加到新列表里,首先要先找到最小值,而找最小值的过程,其实就是把所有值都遍历一遍,所以,增加的操作,时间复杂度式O(n)。

        同理,对于删除操作也一样,你要删掉最小值,首先得找到,而找最小值的过程就是要把列表全部遍历一遍,时间复杂度也是O(n)。

        所以,法1中,增加和删除操作,它俩时间复杂度其实也就是O(n)+O(n),因为他俩是并行运行的,不是嵌套运行,所以结果还是O(n)。外面还有一个for循环,所以法1代码,复杂度就是O(n^{2})

# 法1
def select_sort_simple(li):  
    l1 = []
    for i in range(len(li)):  # 时间复杂度o(n)
        l1.append(min(li))   
        li.remove(min(li)) 

    return l1

result = select_sort_simple([5, 3, 7, 2, 4])
print(result)

# 结果:
[2, 3, 4, 5, 7]

        或许你会说,把最小值,赋值给一个变量,比如,a=min(li),然后每次增加删除这个值,结果还一样吗?答案是肯定一样的,因为,你即使把它赋值给一个变量,但前提,你也得先找到这个最小值,而找最小值的过程就是把列表所有值都遍历一遍,此时它的复杂度就已经是O(n)了,再加上外面的for循环,代码整体复杂度还是O(n^{2})

# 法2 最小值,赋值给一个变量
def select_sort_simple(li):  
    l1 = []
    for i in range(len(li)):  # 时间复杂度 O(n)
        a=min(li)   # 时间复杂度 O(n)
        l1.append(a)   
        li.remove(a)  

    return l1

result = select_sort_simple([5, 3, 7, 2, 4])
print(result)
# 结果同上

2、使用切片的方式控制无序区——推荐

        使用切片的方式控制无序区,每一趟排序后,都将无序区中的最小值,放到无序区的第一个位置,也就是说,把无序区的最小值跟无序区的第一个元素进行交换,此时,这个最小值也就自然放到了有序区的末尾。

跟上面方法相比,虽然时间复杂度一样,但是不用新建空列表。

# 推荐!!!
def select_sort(li): 
    for i in range(len(li) - 1):  # 总共要排n-1趟
        min_val = min(li[i:])  # !!! 每遍历一次,无序区就会少一个数
        a = li.index(min_val)  # 找到最小值的下标
        li[i], li[a] = li[a], li[i]  # 每趟遍历,就把最小值与这趟对应位置上的数进行交换
                           # 或者说,就是把无序区的最小值与无序区第一个数进行交换
    return li


result = select_sort([5, 1, 2, 4])
print(result)
# 结果:
[1, 2, 4, 5]

效果图: 

当然也可以输出每趟排序的结果,结果跟上图也是一样的:

def select_sort(li):
    for i in range(len(li) - 1):  # 总共要排n-1趟
        min_val = min(li[i:])  
        a = li.index(min_val)  # 找到最小值的下标
        li[i], li[a] = li[a], li[i] 
        print(li)  # !!每趟排序后的结果
    return li


result = select_sort([5, 1, 2, 4])
print("最终排序结果", result)

# 结果:
[1, 5, 2, 4]
[1, 2, 5, 4]
[1, 2, 4, 5]
最终排序结果 [1, 2, 4, 5]

面方法中,使用的是切片来控制无序区的大小,(或者叫范围),然后再从这个范围里找最小值,这里呢,我们也可以使用 for 循环的形式来控制无序区的范围。代码如下:

这个跟上面方法类似,但利用切片方式控制无序区范围,相比for循环会更加简洁明了,所以推荐切片的方法。

def select_sort(li):
    for i in range(len(li) - 1):  # 总共要排n-1趟
        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]  # 将无序区第一个数与最小数进行交换
        print(li)  # 每趟排序后的结果
    return li


# result = select_sort([3, 4, 2, 1, 5, 6, 8, 7, 9])
result = select_sort([5, 1, 2, 4])
print("最终排序结果", result)

# 结果:
[1, 5, 2, 4]
[1, 2, 5, 4]
[1, 2, 4, 5]
最终排序结果 [1, 2, 4, 5]

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

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

相关文章

Shell函数数组练习

1、编写函数&#xff0c;实现打印绿色OK和红色FAILED&#xff0c;判断是否有参数&#xff0c;存在为Ok&#xff0c;不存在为FAILED [rootshell ~]# vim ok.sh #!/bin/bash read -p "请输入一个参数:" i function ok…

FFmpeg之AVHWAccel

这也是ffmpeg解码器中比较重要的一个模块&#xff0c;很多人认识它应该是通过一条命令 ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input.mp4 -c:v h264_nvenc -b:v 5M output.mp4命令地址&#xff1a;英伟达ffmpeg 大家可能觉得这就是nvcodec了&#xff0c;后来发…

域渗透之Exchange

域内部署Exchange 首先这里环境的话是&#xff1a; DC: win2012 exchange服务器: win2012 exchange 2016首先我们去装win2012虚拟机的时候需要给两个网卡&#xff0c;一个是内网&#xff0c;一个是外网的网卡。 内网的dns设置为域控的IP。 外网就不需要指定ip了。 首先需要…

《码农的噩梦与修电脑的奇幻之旅》

故事从一个充满梦想的码农学习计算机编程开始。他对编写程序充满了热情&#xff0c;认为自己就像是一位能够编织魔法的巫师&#xff0c;能够创造出炫酷的虚拟世界。 然而&#xff0c;这个充满幻想的故事在码农入门的第一天就遭遇了突如其来的挫折。电脑故障了&#xff01;所有…

GPT-4V 在机器人领域的应用

在科技的浩渺宇宙中&#xff0c;OpenAI如一颗璀璨的星辰&#xff0c;于2023年9月25日&#xff0c;以一种全新的方式&#xff0c;向世界揭示了其最新的人工智能力作——GPT-4V模型。这次升级&#xff0c;为其旗下的聊天机器人ChatGPT装配了语音和图像的新功能&#xff0c;使得用…

zabbix6入门到精通(2)宏定义

zabbix6入门到精通&#xff08;2&#xff09;宏定义 https://www.yuque.com/fenghuo-tbnd9/ffmkvs/sipmmw https://www.zabbix.com/documentation/6.0/zh/manual/appendix/macros/supported_by_location 配置— 主机 — 主机名称 — {$CPU.INTERVAL.TIME} CPU评估间隔时间…

Qt Desktop Widgets 控件绘图原理逐步分析拆解

Qt 是目前C语言首选的框架库。之所以称为框架库而不单单是GUI库&#xff0c;是因为Qt提供了远远超过GUI的功能封装&#xff0c;即使不使用GUI的后台服务&#xff0c;也可以用Qt大大提高跨平台的能力。 仅就界面来说&#xff0c;Qt 保持各个平台绘图等效果的统一&#xff0c;并…

Linux常用命令---- test 命令

文章目录 基本语法文件测试检查文件是否存在检查文件是否是目录检查文件是否为空检查文件是否可读、可写或可执行 字符串测试检查字符串是否为空检查字符串是否相等检查字符串是否不相等 数字测试检查数字是否相等检查数字是否大于或小于 在Linux操作系统中&#xff0c;test命令…

Oracle 透明网关安装

Oracle 11g透明网关连接Sqlserver oracle 透明网关是oracle连接异构数据库提供的一种技术。通过Gateway&#xff0c;可以在Oracle里透明的访问其他不同的数据库&#xff0c;如SQL Server, DB2, Sybase等等&#xff0c;就像远程Oracle数据库一样。配置后的sql查询的处理流程&…

数据库中常用的锁

目录 1、数据库中常用的锁类型 2、常见的数据库 3、以MySQL为例 3.1 MySQL的事务 3.2 MySQL事务的四大特性 1. 原子性&#xff08;Atomicity&#xff09; 2. 一致性&#xff08;Consistency&#xff09; 3. 隔离性&#xff08;Isolation&#xff09; ⭐mysql中的事务隔…

容器化升级对服务有哪些影响?

容器技术是近几年计算机领域的热门技术&#xff0c;特别是随着各种云服务的发展&#xff0c;越来越多的服务运行在以 Docker 为代表的容器之内。 本文我们就来分享一下容器化技术相关的知识。 容器化技术简介 相比传统虚拟化技术&#xff0c;容器技术是一种更加轻量级的操作…

程序员考公笔记之逻辑判断(图形推理)

文章目录 写在前面1、逻辑判断1.1、图形推理1.1.1、位置类1.1.2、样式类1.1.3、数量类1.1.4、属性类1.1.5、六面体 写在前面 1、逻辑判断 1.1、图形推理 观察&#xff1a;先宏观&#xff0c;再微观 图形推理的命题形式&#xff1a; 一组式 观察路径&#xff1a;顺序看(考最…

数据结构之优先级队列(堆)及top-k问题讲解

&#x1f495;"哪里会有人喜欢孤独&#xff0c;不过是不喜欢失望。"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;数据结构之优先级队列(堆) 一.优先级队列 1.概念 我们已经学习过队列&#xff0c;队列是一种先进先出(FIFO)的数据结构&#xff…

单线圈无刷直流电机驱动芯片选型分析,可应用于笔记本,显卡风散热风扇,变频冷却风扇,打印机风扇等产品上

单线圈无刷直流电机的电机驱动器。 GC1298R/S&#xff0c;GC1262E/S&#xff0c;GC1298R/S&#xff0c;GC1262R/S具有高效的直接PWM控制方式&#xff0c;它可以控制无刷直流电机转速。它集成了最低速度限制模式、可调速度斜率控制模式、软启动模式、风扇转速计、锁保护、自动重…

PGSQL 设置autovacuum

VACUUM和ANALYZE是PostgreSQL 数据库维护最重要的两个操作。 vacuum用于恢复表中“死元组”占用的空间。删除或更新&#xff08;删除后插入&#xff09;记录时&#xff0c;将产生死元组。PostgreSQL不会从表中物理删除旧行&#xff0c;而是在其上放置一个“标记”&#xff0c;以…

java定位系统源码,UWB技术的无线定位系统源码

UWB技术是一种传输速率高&#xff0c;发射功率较低&#xff0c;穿透能力较强并且是基于极窄脉冲的无线技术。UWB最优的应用环境是室内或者相对密闭的空间&#xff0c;有着厘米级的定位精度&#xff0c;不仅可以非常精准地进行位置跟踪&#xff0c;还可以快速地进行数据传输。 智…

DNF 单机联网 搭建教程(附视频)

更多游戏搭建&pvf修改教程请见: DNF教程 注意&#xff1a;请不要将游戏进行商业化&#xff0c;一切后果概不负责。仅供单机&#xff0c;好友之间进行娱乐&#xff01;&#xff01; 注意&#xff1a;请不要将游戏进行商业化&#xff0c;一切后果概不负责。仅供单机&#…

Vue笔记-在axios中的than函数中使用this需要注意的地方

在Vue中&#xff0c;可以使用this关键字来访问到组件中定义的变量。然而&#xff0c;在axios的then函数中&#xff0c;this关键字的作用域会改变&#xff0c;会指向axios对象本身而不是Vue组件实例。因此&#xff0c;不能直接访问到Vue组件中定义的变量。 解决这个问题的一种方…

git入门教程+常用命令

Git入门教程 本文章主要参照视频教程&#xff1a;https://www.bilibili.com/video/BV1FE411P7B3/?spm_id_from333.337.search-card.all.click&vd_source06caf161b187fb3f4c039bc15e238fea 为什么要使用GIT 版本控制是项目、文档迭代的必然要求&#xff0c;所以需要使用…

如何在 IDEA 中设置远程连接服务器开发环境并实现固定地址远程 Linux 环境

文章目录 1. 检查Linux SSH服务2. 本地连接测试3. Linux 安装Cpolar4. 创建远程连接公网地址5. 公网远程连接测试6. 固定连接公网地址7. 固定地址连接测试 本文主要介绍如何在IDEA中设置远程连接服务器开发环境&#xff0c;并结合Cpolar内网穿透工具实现无公网远程连接&#xf…