排序算法之详解选择排序

news2024/11/23 6:22:09

引入

  • 选择排序顾名思义是需要进行选择的,那么就要问题了,选择到底是选择什么呢?
  • 选择排序的选择是选择数组中未排序的数组最小的值,将被选择的元素放在未排序数组首位

如果你对 ‘未排序数组’ , ‘选择’ 的概念不理解,那么你可以看看下面的图

思路

  • 有了上面的一些基础之后,我们再来说说选择排序算法的思路
    1. 不断的选择未排序数组中最小的值,将其与未排序数组的首位元素进行换位
    2. 选择完一个最小值,未排序的数组长度就要减一,且是从下标为0处开始减
    3. 当未排序数组就剩两个数时,就是最后一次选择,完成此次排序,算法结束,数组排序完成
  • 乍一看,选择排序算法有点像冒泡排序,只不过冒泡排序是选择大的数往后走,选择排序是选择小的数往前走
    1. 其实并不是这样的,数往前后走并没有关系
    2. 冒泡排序是经过不断的相邻换位,来完成排序的
    3. 而选择排序,只需选择(保存)最大或最小的数及这个数的下标,遍历完未排序数组之后,再进行一次换位
    4. 冒泡排序是通过数去找位置,选择排序是给定位置去找数
  • 如果你还不明白,那么就再看看下面这张图,说明:该图转载于菜鸟教程

 

具体实现过程

  • 下面我们就以 [ -8 , 10 , 30 ,6 , 9 , 10 , 100 , 76 ] 为例,讲解选择排序的具体过程

第一次排序

  • 我们先进行选择,将未排序数组的第一个元素作为被选则的元素 【value = -8 ,index = 0】
  • 用一个指针从未排序数组的第一个元素往后逐渐遍历 ,如果有小于当前 value 的 ,就将 value 和 index 的值替换为更小的元素的 值 和 下标
  • 遍历完成,由于没有小于 -8 的元素 ,所以value 和 index 不做改动 【即不交换】
  • 完成第一次排序之后,未排序的数组(逻辑意义上的数组)就变成了 [ 10 , 30 ,6 , 9 , 10 , 100 , 76 ] ,前面已排序的数组 [-8 ]

第二次排序

  • 我们先进行选择,将未排序数组的第一个元素作为被选则的元素 【value = 10 ,index = 1】
  • 用一个指针从未排序数组的第一个元素往后逐渐遍历 ,如果有小于当前 value 的 ,就将 value 和 index 的值替换为更小的元素的 值 和 下标
  • 先找到了 value1 = 6 , index1 = 3 ,改变 value 与 index的值 value= value1 , index = index1
  • 遍历完成,由于index经过了改变 ,所以需要进行换位 , 未排序数组第一个元素 与 index下标元素进行换位
  • 完成第二次排序之后,未排序的数组(逻辑意义上的数组)就变成了 [ 30 ,10 , 9 , 10 , 100 , 76 ] ,前面已排序的数组 [-8 , 6]

......

  • 就这样不断地重复,选择未排序数组中最小的值,将其与未排序数组的首位元素进行换位

最后一次排序

  • 不断地进行排序之后,数组变成了个样子 [ -8 , 6 , 9 ,10 , 10 ,30 , 100 ,76 ]
  • 此时已排序的数组变成了 [ -8 , 6 , 9 ,10 , 10 ,30 ] , 未排序的数组为 [ 100 ,76 ]
  • 我们只需进行最后一次排序,就可以完成整个数组的排序
  • 选择未排序数组的第一个元素 , index = 6 , value = 100
  • 通过指针遍历未排序数组 ,试着寻找 比 value小的数
    • 找到则交换 ,交换后进行下次寻找 ,直至数组遍历完成
  • 最终 ,index = 7 , value = 76
  • 由于此时 index已经改变 ,所以需要进行换位 ,未排序数组第一个元素 与 index下标元素进行换位

代码实现

// 选择排序算法
public static int[] selectSort(int[] array){
    // for循环 ,i表示需要正在选择 第 i 个 最小值 ,从0开始  
    // 一共需要找 array.length-1个最小值
    for (int i = 0; i < array.length-1; i++) {
        // val用于存储被选则的值 ,即最小值 
        // 默认选择未排序数组的第一个元素 ,如果有更小的则更新
        int val = array[i];
        // index用于存储当前最小值对应的数组下标
        // 默认选择未排序数组的第一个元素的下标 ,最小值更新,i也随之更新
        int index = i;     
        // 遍历未选择的数组
        for (int j = i+1; j < array.length; j++) {
            // 试图寻找比被选择的值 更小 的元素 ,如果有 ,则对 val 和 index 进行更新
            if (val > array[j]){
                val = array[j];
                index = j;
            }
        }
        // 如果 i == index ,则代表被选则的值并未改变,即还是未排序数组的第一个元素,所以不用交换
        if (i != index){
            array[index] = array[i];
            array[i] = val;
        }
    }
    return array;
}

  

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

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

相关文章

C++中机器人应用程序的行为树(ROS2)

马库斯布赫霍尔茨 一、说明 以下文章为您提供了对机器人应用程序或框架中经常使用的行为树的一般直觉&#xff1a;ROS&#xff0c;Moveit和NAV2。了解行为 Tress &#xff08;BT&#xff09; 框架的原理为您提供了在游戏领域应用知识的绝佳机会。BT可以与Unity或Unreal集成。 由…

淘宝有哪些值得抓取的数据?通过API可以获取到哪些数据?

淘宝是中国最大的在线购物平台&#xff0c;有丰富的数据可供抓取。以下是一些值得抓取的数据以及通过API可以获取到的数据&#xff1a; 1. 商品信息&#xff1a;包括商品标题、价格、销量、评价等。 2. 店铺信息&#xff1a;包括店铺名称、店铺信用、开店时间等。 3. 物流信…

java测试抽红包接口概率《搬代码》

1.首先我们进行抽红包概率测试的时候&#xff0c;为了测试抽取红包的概率完全正确。个人建议不使用线程池多线程执行&#xff0c;建议直接使用for循环执行 2.我们调取抽红包接口返回的信息值进行判断 3.下面就是判断代码&#xff0c;然后是抽红包接口代码 Test public static …

探索智能文字识别:技术、应用与发展前景

探索智能文字识别&#xff1a;技术、应用与发展前景 前言一张图全览大赛作品解读随心记你不对我对小结 智能文字识别体系化解读图像预处理文字定位和分割文字区域识别图像校正字体识别和匹配结果后处理小结 如何应对复杂场景下挑战复杂场景应对方法小结 人才时代对人才要求合合…

源代码审计对企业有哪些好处?

源代码扫描 源代码扫描&#xff0c;对应用程序进行静态漏洞扫描&#xff0c;分析源代码中存在的安全风险&#xff0c;运行应用于模拟器中对应用进行实时漏洞攻击检测。 你是否了解源代码扫描对企业的好处&#xff1f; 一、源代码扫描&#xff0c;通常能够帮助企业解决这些问题…

docker 01(初识docker)

一、docker概念 Docker是一个开源的应用容器引擎&#xff1b;诞生于2013年初&#xff0c;基于Go 语言实现&#xff0c;dotCloud公司出品(后改名为Dockerlnc);Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的Linux …

KCC@杭州-在初秋,来一场智力与体能的比拼

本次主题&#xff1a; 开源知识问答桌游/运动&#xff08;一场智力与体力的比拼&#xff09; KCC杭州活动又来啦&#xff01; 在这个如火的八月&#xff0c;我们将要开启KCC杭州的一场特色开源活动。 为了让活动更加有趣味&#xff0c;更加具有互动性&#xff0c;我们将采用知识…

QTreeWidget和QTreeWidgetItem

QTreeWidget介绍 QTreeWidget 是一个用于显示层次结构数据的 Qt 控件&#xff0c;它以树状结构的形式展示项目和子项。每个项目都可以包含子项&#xff0c;并且可以通过展开和折叠来浏览整个树。 QTreeWidget类是一个方便的类&#xff0c;它提供了一个带有经典基于项目的界面…

AI极客日报0822 - AI创作是否应该有版权?

&#x1f440;AI 日报合集 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; 人工智能系统依法享有版权吗&#xff1f;这位法官给出了肯定的答案。让我们开始吧。 今日看点&#xff1a; 一位联邦法官明确表示&#xff0c;AI创作的艺术品没有版权&#xff01;中国&#xff0c…

WGS84地球坐标系,GCJ02火星坐标系,BD09百度坐标系简介与转换 资料收集

野火 ATGM332D简介 高性能、低功耗 GPS、北斗双模定位模块 STM32 GPS定位_为了维护世界和平_的博客-CSDN博客 秉火多功能调试助手上位机开源&#xff01;共六款软件&#xff0c;学到你吐... , - 电脑上位机 - 野火电子论坛 - Powered by Discuz! https://www.firebbs.cn/for…

静态代码扫描工具 Sonar 配置及使用

概览 Sonar 是一个用于代码质量管理的开放平台。通过插件机制&#xff0c;Sonar 可以集成不同的测试工具&#xff0c;代码分析工具&#xff0c;以及持续集成工具。与持续集成工具&#xff08;例如 Hudson/Jenkins 等&#xff09;不同&#xff0c;Sonar 并不是简单地把不同的代…

定向流量卡怎么没人买了呢?你知道定向流量卡有多坑吗?

在购买流量卡的时候大家可能都注意了&#xff0c;市面上的流量卡有三种&#xff0c;定向流量卡&#xff0c;通用流量卡&#xff0c;通用流量定向流量卡&#xff0c;据小编了解&#xff0c;现在越来越多的人比较喜欢购买后两者&#xff0c;而关注定向流量卡越来越少了。 其实用过…

中国移动秋招攻略,网申测评和面试

中国移动秋招简介 按照往年的惯例来看&#xff0c;移动会在每年的8月份发布相关秋招信息&#xff0c;紧接着考生并进行网申&#xff0c;面试的时间跨度也非常的长&#xff0c;大概是9~12月份。整个招聘流程&#xff0c;包括投递简历网申&#xff0c;笔试测评&#xff0c;面试录…

SQL Server、MySQL和Oracle数据库分页查询的区别与联系

摘要&#xff1a;本文将通过一个现实例子&#xff0c;详细解释SQL Server、MySQL和Oracle这三种常见关系型数据库在分页查询方面的区别与联系。我们将提供具体场景下的SQL语句示例&#xff0c;并解释每个数据库的分页查询用法以及优化方法&#xff0c;帮助读者更好地选择适合自…

大白话聊聊Innodb的锁机制

大白话聊聊Innodb的锁机制 引言理清 "锁" 类型锁锁的类型非锁定读(MVCC)锁定读用来保护 "自增长计数器" 的锁外键和锁 加锁算法精确匹配查询如何关闭Gap Lock小结 幻读问题小结 锁问题脏读不可重复读丢失更新 阻塞死锁死锁发生概率死锁案例 锁升级小结 引言…

go 微服务 consul

服务发现 在微服务中每一个服务都有一个ip端口&#xff0c;如果由客户端来之间进行连接会不方便&#xff0c;因此服务将自己的ip端口提交给服务发现&#xff08;常见的有consul,etcd&#xff0c;nacos&#xff09;,客户端通过服务发现来获取服务的ip端口 consul 去下载&…

Serialize对象二进制序列化与反序列化存储参数代替ini文件

序列化是将对象的状态信息转换为可以存储或传输的形式的过程。在C#中&#xff0c;可以使用System.Runtime.Serialization命名空间中的类来进行序列化操作。 以下是在C#中使用序列化的基本步骤&#xff1a; 创建一个可序列化的类&#xff0c;并标记该类和需要序列化的属性或字段…

deeplabv3+源码之慢慢解析26 第五章utils文件夹(1)ext_transforms.py--2个翻转类和ExtCompose类

系列文章目录&#xff08;更新中&#xff09; 第一章deeplabv3源码之慢慢解析 根目录(1)main.py–get_argparser函数 第一章deeplabv3源码之慢慢解析 根目录(2)main.py–get_dataset函数 第一章deeplabv3源码之慢慢解析 根目录(3)main.py–validate函数 第一章deeplabv3源码之慢…

Maven解析

目录 Maven的概念 Pom 项目坐标 仓库 Maven环境搭建 安装jdk 配置maven 配置本地仓库地址 配置阿里云 maven 镜像仓库&#xff0c;下载速度更快 在idea中配置maven ​编辑 pom中名词解释 Maven命令 Maven的概念 Maven 是 Apache 软件基金会的一个开源项目,是一个…

PySide6学习笔记--基础环境的安装配置

PySide6介绍 QT官方发布Qt6.0之后&#xff0c;紧接着于2020年12月10日发布了PySide 6&#xff0c;对应C版的Qt6。从PySide6开始&#xff0c;PySide的命名也会与Qt的大版本号保持一致。需要注意的是使用PySide6开发的程序在默认情况下&#xff0c;不兼容Windows7系统&#xff0c…