【排序算法】选择排序
文章目录
- 一:基本介绍
- 1.1 概念
- 1.2 算法思想
- 1.3 思路分析图
- 1.4 思路分析
- 1.5 总结
- 1.5.1 选择排序一共有数组大小-1轮排序
- 1.5.2 每一轮排序,又是一个循环,循环的规则如下(在代码中实现):
- 二:代码实现
- 2.1 源码
- 2.2 执行结果
- 2.3 测试八万条数据
- 三:算法性能分析
- 3.1 时间复杂度
- 3.2 空间复杂度
- 3.3 稳定性
一:基本介绍
1.1 概念
选择排序(select sorting)属于内部排序法,是从待排序的数据中,按指定的规则选出某一元素,再按照规定交换位置后达到排序的目的。
1.2 算法思想
第一次从arr[0] ~ arr[n-1]中选取最小值,与arr[0]交换,第二次从arr[1] ~arr[n-1]中选取最小值,与arr[1]交换,第三次从arr[2] ~ arr[n-1]中选取最小值,与arr[2]交换,…,第i次从arr[i-1] ~arr[n-1]中选取最小值,与arr[i-1]交换,…, 第n-1次从arr[n-2] ~arr[n-1]中选取最小值,与arr[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。
每一次从待排序的数据元素中选出最小(或最大)的一个元素,将元素存放在序列的起始位置(即与待排序列的第一个元素的位置进行交换)。然后再从剩余的未排序元素中寻找最小(或最大)的元素,然后存放在已排序序列的末尾。以此类推,直到将待排序的元素全部排完。
1.3 思路分析图

1.4 思路分析
原始数组:[86, 21, 156, 6]
第一次排序: 从4个元素里面找到最小的,与第1个元素进行交换,将最小元素存放在起始位置
排序后为:6,21 , 156, 86
第二趟排序: 从剩下的3个元素里面找到最小的,与待排序列的第1个元素进行交换,将最小元素存放在已经排好序的序列尾部。
排序后为:6,21 , 156, 86
第三趟排序: 从剩下的2个元素里面找最小的,与待排序列的第1个元素进行交换
排序后为:6,21 , 86,156
1.5 总结
1.5.1 选择排序一共有数组大小-1轮排序
1.5.2 每一轮排序,又是一个循环,循环的规则如下(在代码中实现):
- 先假定当前这个数是最小数
- 和后面的每个数进行比较,如果发现有比它更小的数,就重新确定最小数,并得到下标
- 当遍历完数组之后,就会得到本轮最小数及其下标
- 进行交换
二:代码实现
2.1 源码
import java.util.Arrays;/*** 选择排序*/
public class SelectSort {public static void main(String[] args) {int[] array = new int[8];for (int i = 0; i < array.length; i++) {//Math.random() * 80000生成0到100的随机数array[i] = (int) (Math.random() * 100);}System.out.println("排序前:" + Arrays.toString(array));selectSort(array);System.out.println("排序后:" + Arrays.toString(array));}/*** 选择排序** @param array 需要排序的数组*/public static void selectSort(int[] array) {//使用逐步推倒的方式来讲解选择排序//第一轮//原始的数组:101,34,119,1//第一轮排序:1,34,101,119//算法先简单-->后复杂。可以将复杂算法简单化for (int i = 0; i < array.length - 1; i++) {//第一轮//假定最小处的索引就是0int minIndex = i;//最小处的数值则为int min = array[minIndex];for (int j = i + 1; j < array.length; j++) {if (min > array[j]) {//如果此条件成立,说明假定的最小值就不成立//此时我们需要重置最小值minIndex = j;min = array[minIndex];}}//交换之前需要进行判断if (minIndex != i) {//for循环结束后则最小值就已经找到了,此时我们需要将下标为0处的数重新替换为最小值//将原本最小值的位置替换为array[0]array[minIndex] = array[i];//将最小值放在array[0],即交换array[i] = min;}System.out.println("第" + i + "轮过后排序为:" + Arrays.toString(array));}}
}
2.2 执行结果

2.3 测试八万条数据

八万个数据的排序时间是1536毫秒,很明显是比冒泡排序短很多的!
三:算法性能分析
3.1 时间复杂度
最优时间复杂度、最坏时间复杂度、平均时间复杂度都是O(n^2),因为无论你是否完全有序,还是完全逆序,都需要找出后边的最小值进行替换。
相比较冒泡排序,每次比较后,只更新最小值的下标,每轮循环值最多只做一次值交换。时间上得到了很大的提升。但是也是使用了双层循环,时间复杂度和冒泡排序的一样。
3.2 空间复杂度
空间复杂度为O(1)
3.3 稳定性
选择排序是不稳定的排序算法。
举个例子:
例如数组:[ 5 , 8 , 5 , 2 ]
使用选择排序算法第一次找到的最小元素是2,与第一个位置的元素5进行交换,那此时第一个5和中间的5顺序就发生了变化,因此不稳定。
相关文章:
【排序算法】选择排序
文章目录 一:基本介绍1.1 概念1.2 算法思想1.3 思路分析图1.4 思路分析1.5 总结1.5.1 选择排序一共有数组大小-1轮排序1.5.2 每一轮排序,又是一个循环,循环的规则如下(在代码中实现): 二:代码实…...
Netty深入浅出(无处不在的IO)
为什么要有Netty Netty是为了解决网络编程的复杂性和提供易于使用、高性能和可扩展的框架而开发的。它通过提供一组可重用的组件来处理网络通信的低级细节,例如套接字管理、线程和缓冲,简化了开发网络应用程序的过程。这使开发人员可以专注于应用程序逻…...
华为C语言编程规范(2W字总结)
1、代码总体原则 1、清晰第一 清晰性是易于维护、易于重构的程序必需具备的特征。代码首先是给人读的,好的代码应当可以像文章一样发声朗诵出来。 目前软件维护期成本占整个生命周期成本的40%~90%。根据业界经验,维护期变更代码的成本,小型…...
操作系统学习笔记2
参考视频:操作系统 文章目录 1、进程管理逻辑图2、进程的由来3、进程引发的问题4、进程与程序的区别5、进程的特征6、进程的组织7、进程的状态与控制8、进程间的通信9、三级调度10、FCFS算法调度过程11、时间片轮转算法调度过程12、短作业有优先算法调度过程13、优…...
KylinOSv10系统k8s集群启动mysql5.7占用内存高的问题
问题现象 麒麟系统搭建k8s集群 mysql的pod启动失败 describe查看ommkill,放大limit资源限制到30G依旧启动失败 系统 报错信息 原因 内存占用太高 open_files_limit初始化太高 解决: 1、更换镜像 链接: https://pan.baidu.com/s/1b9uJLcc5Os0uDqD1e…...
c语言练习84:动态内存管理
动态内存管理 例题: 错误代码: #include<stdio.h> #include<stdlib.h> void GetMemory(char* p) {p (char*)malloc(100); } void Test(void) {char* str NULL;GetMemory(str);strcpy(str, "hello world");printf(str); } int …...
[Go版]设计模式——Template模版方法模式
目录 模板方法(Template Method)模式的说明核心思想设计优点 Go语言实现该模式的示例代码 模板方法(Template Method)模式的说明 核心思想 定义一个算法的骨架,将一些步骤的实现延迟到子类。 设计优点 将通用的模版…...
数据结构 | (四) Queue
队列 :只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out) 入队列:进行插入操作的一端称为 队尾( Tail/Rear ) 出队列:进行删除操…...
让照片人物开口说话,SadTalker 安装及使用(避坑指南)
AI技术突飞猛进,不断的改变着人们的工作和生活。数字人直播作为新兴形式,必将成为未来趋势,具有巨大的、广阔的、惊人的市场前景。它将不断融合创新技术和跨界合作,提供更具个性化和多样化的互动体验,成为未来的一种趋…...
系统架构设计:6 论软件质量保证及其应用
目录 一 软件质量保证SQA 1 制定SQA计划 2 参与但不负责开发项目的软件过程描述 3 评审...
vscode的窗口下拉显示行数不够
这是为了减少程序的空间占用而存在的一个设置。设置一下即可。 设置方法 在左上角文件,个人设置,设置中,(或者用Ctrl,打开) 输入terminal,找到bell duration,设置成1000。 参考…...
Linux UWB Stack实现——MCPS调度接口(数据结构)
MCPS(MAC Common Part Sublayer,媒介访问控制(Medium Access Control)公共部分子层)调度接口,文件:include\net\mcps802154_schedule.h。 MCPS访问方法 // MCPS 802154 访问方法 enum mcps8021…...
2023Q3数据安全政策、法规、标准及报告汇总(附下载)
数据安全处罚事件逐年升高,2023年呈爆发式增长。 截至2023年8月31日,南都大数据研究院通过各地行政执法公示平台、媒体报道等公开渠道收集到146起依据《数据安全法》作出行政处罚决定的案例。2021年公示5起,2022年公示11起,2023年…...
Ceph入门到精通-iptables 限制多个ip 的多个端口段访问
要使用iptables限制多个IP的多个端口范围的访问,可以使用以下命令: iptables -A INPUT -p tcp -m multiport --dports 端口段 -m iprange --src-range 起始IP-结束IP -j DROP上面的命令将添加一条规则到INPUT链中,该规则将禁止指定IP范围访问…...
【C/C++】STL——深度剖析vector容器
👻内容专栏: C/C编程 🐨本文概括:vector的介绍与使用、深度剖析及模拟实现。 🐼本文作者: 阿四啊 🐸发布时间:2023.10.8 一、vector的介绍与使用 1. vector的介绍 像string的学习…...
如何在idea中隐藏文件或文件夹
例如我想要隐藏如下文件 只需要点击file->settings editor->file types->ignores Files and Folders-> 然后按照图片点击顺序操作即可 添加完毕点击apply->ok 隐藏成功后效果如下:...
Scala第二十章节
Scala第二十章节 scala总目录 文档资料下载 章节目标 理解Akka并发编程框架简介掌握Akka入门案例掌握Akka定时任务代码实现掌握两个进程间通信的案例掌握简易版spark通信框架案例 1. Akka并发编程框架简介 1.1 Akka概述 Akka是一个用于构建高并发、分布式和可扩展的基于事…...
redis的持久化消息队列
Redis Stream Redis Stream 是 Redis 5.0 版本新增加的数据结构。 Redis Stream 主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法…...
分类预测 | MATLAB实现KOA-CNN开普勒算法优化卷积神经网络数据分类预测
分类预测 | MATLAB实现KOA-CNN开普勒算法优化卷积神经网络数据分类预测 目录 分类预测 | MATLAB实现KOA-CNN开普勒算法优化卷积神经网络数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现KOA-CNN开普勒算法优化卷积神经网络数据分类预测࿰…...
用 Pytorch 自己构建一个Transformer
一、说明 用pytorch自己构建一个transformer并不是难事,本篇使用pytorch随机生成五千个32位数的词向量做为源语言词表,再生成五千个32位数的词向量做为目标语言词表,让它们模拟翻译过程,transformer全部用pytorch实现,具备一定实战意义。 二、论文和概要 …...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
