选择排序详解

2023-05-16

选择排序详解

文章目录

      • 选择排序详解
        • 1.选择排序算法详解
            • 1.药引子——我自己的排序方法
            • 2.命根子——选择排序的精髓
            • 3.选择排序图解
            • 4.总结
        • 2.选择排序的代码详解

摘要:选择排序算法是一种比较容易理解的排序算法,记得我在第一次学习C语言的时候,老师让我们自己尝试写一个排序,我们很多人下意识写出来的就是一种具有选择排序思想的排序算法,只不过那种算法会花费一个额外的数组进行存储,在学习了选择排序算法之后,我知道了那个数组是没有必要声明的

1.选择排序算法详解

1.药引子——我自己的排序方法

​ 选择排序是一种非常基础的排序算法,其排序关键在于:使用查找最大值/最小值的方法,查询出数组中的最大/最小值,然后将这个最大/最小值放到数组的最后/最前边,现在,我们用我刚学C语言时的那种选择手段进行理解:

​ 首先我们得到一个数组之后:

​ 我们要创建一片和这个数组一样大的数组区域,用于存储已经排好序的新数组:

​ 现在,我们开始对数组进行最大值选取,数组中找最大值的方法想必大家都会,因此在这里不再赘述,总之我们在第一次会找到15,找到之后我们将15放在新数组的最后边:

​ 如上图所示,我们使用某种方式,反正就是在下次寻找最大值的时候,不再考虑15了,然后重复找最大值然后放在新数组中的这个过程,这样将整个数组都标记完之后,我们就能对这个数组排序。然而,这个方法效率太低了,首先就是标记这个事情,就很难办,当初我是使用了另外一个新数组来存储已经被当成过最大值的数,每次在遍历到一个原数组中的值后,都会现在这个标记数组中查一下,如果它不存在标记数组中,那么我再考虑它是否是最大值这件事,总之这种方法既浪费空间,又浪费时间,不知道人类早期有没有用过我这种方法,我想如果早期的程序员们如果都是精英的话,那肯定连想到都不会想到我这种双浪费的方法。然而我的这个基础方法虽然简单,但是已经体现出了选择排序的思想了,那就是找最大/最小值,然后将它们放在属于自己的合适位置。

2.命根子——选择排序的精髓

​ 现在我们来正式开始讲解选择排序,选择排序是一种简单基础好理解的排序方法,但我仍然要记录一下。首先我们在上文中已经透露了选择排序的思想,那么选择排序是如何高效的完成这个排序行为的呢?首先我们需要理解的是:排序行为,本身可以理解为让数字们移动到各自合适的位置的过程。这个思想将在归并排序中有更加明显的体现,既然排序行为是让数字们各归其位的过程,那我们如何知道哪个数字应该去哪个位置呢?也许人类能一眼看出,但是计算机却没有人类那么聪明,因此我们不得不使用更简单的方式告诉计算机:一个数组中的数字,最大的一定在最后边,最小的一定在最前边,计算机秉持着这个指令,就可以在找到最大的数字之后将其放到最后边或者将最小的数字放到最前边,然后…然后呢?计算机可以找到一个数组中最大的或者最小的数字,但是它能找到次大或者次小的吗?答案仍然是不可以,计算机没有这么智能,因此我们还要告诉计算机一个指令,那就是在将当前数组的最大值放到最后边或者将数组的最小值放到最前边之后,你要缩小这个数组的规模,不再考虑最后一位或者最前一位,你要在这个缩小规模的新数组中重新重复刚才的行为。好了,这就是选择排序

3.选择排序图解

​ 如图所示,我们已经得到了一个数组,它是无序的,现在,我们开始寻找这个无序数组中的最小值(也可以寻找最大值,但是这里我们以寻找最小值为例。),首先,我们摘到了0,我们发现0是最小值,因此我们让0和数组首位互换位置:

​ 之后,我们缩小数组的范围,我们从数组的第二个位置开始算起,将原数组中以下标为1的元素为首元素的子数组作为新数组(蓝色填充区域为新数组),然后我们在这个新数组中重复刚才的取最小值并交换的行为:

​ 现在,我们可以找到新数组中的最小值是1,因此我们将1和新数组的首元素位置进行互换,但是这里1所在的位置就是首元素位置,所以这里交换行为实际上没什么意义,之后我们再次缩小数组规模并重复检索行为:

​ 现在,我们经过检索发现,2是当前新数组中的最小元素,因此我们将其和该数组的首元素进行位置互换:

​ 之后,我们继续缩小数组规模,并重复检索行为:

​ 我们经过检索发现,当前数组中的最小元素为3,因此我们继续将其和当前数组中的首元素进行位置互换:

​ 现在我们继续缩小数组的规模,并继续检索:

​ 经过检索我们发现,当前数组中的最小元素是4,它也恰好是首元素,因此这里交换行为没什么意义,并继续下一轮循环,缩小一次数组规模并继续检索:

​ 经过检索我们发现,当前数组中的最小元素是7,它恰好也是首节点,因此这里的交换行为同样没什么意义,在经过没有意义但是必须执行的交换之后,我们开始下一轮循环,缩小数组规模并重新开始检索:

​ 在当前新数组中,我们发现最小的元素是9,我们将其哈数组的首元素进行互换:

​ 之后我们继续缩小数组规模并重新进行检索:

​ 然而此时我们发现,新数组中只剩下一个元素,我们已经将整个数组遍历完一遍了,因此此时整个程序就宣告结束,而这个数组,实际上也排好序了。

​ 这就是选择排序。

4.总结

​ 因此我们可以看到选择排序的原理实际上就是不断的寻找当前数组中的最小元素/最大元素,然后将他们放到最前边/最后边的位置上去,这个位置的放置是通过交换来实现的,因为它们被放置在最前/后边的位置上以后,数组就要从最前边/后边缩小一个单位,也就是不再考虑已经被排好序,放在正确位置上的那个元素了,而是要考虑剩下的元素们,通过交换,我们可以将之前数组中的最小/最大元素放到相应位置去,并把之前那个位置上的元素转移到即将要被重复这个行为的新数组中来,通过这种方法我们可以巧妙方便的在原数组上构建新数组,而不需要额外的数组空间进行结果数组的保存,也无需使用其他数组来标志哪个元素已经被排过序了这一事件,这就是选择排序的巧妙之处。

2.选择排序的代码详解

​ 接下来我们来看看选择排序算法的代码,并对代码进行详细的分析:

public static void searchSort(int[] arr){
        for (int i = 0; i<arr.length - 1; i++){//①
            int minIndex = i;
            int min = arr[i];//②
            for (int j = i + 1; j<arr.length; j++){//③
                if(min>arr[j]){
                    min = arr[j];
                    minIndex = j;
                }
            }
            arr[minIndex] = arr[i];
            arr[i] = min;//④
        }
        System.out.println(Arrays.toString(arr));
    }

​ ①.我们定义一个循环,这个循环就是用来进行上述的每轮排序行为的,在这个循环中,每轮循环都会找到当前数组中的最小值,并让这个最小值和当前数组的首元素进行位置互换。与此同时,循环头中的变量i在这里也有有着丰富的含义,它不仅代表循环的次数,它也代表着每次轮循环中数组的首元素位置,当数组中的首元素位置就是原最大的那个数组中最后一个元素的位置时,就说明排序已经到头,算法可以结束了。

​ ②.我们定义最小值的下标变量,同时定义最小值。这里主要是找最值的方法,找最值的方法一般都是默认数组首节点是最值点,然后对数组进行遍历,在遍历过程中会依次查看整个数组中的所有元素并和最值进行对比,如果发现了比最值小的元素,那么就让当前的数组元素替换掉之前的最值元素成为新的最值元素,如这里使用minIndex保存最值下标,使用min保存最值,当找到数组中新的最值时,新的最值下标就会替换掉minIndex中原来的值,而新的最值也会替换掉min中原来的值。

​ ③.这个循环就是找最值的循环体,具体解释看上文中②的解释。

​ ④.这里的两句代码就是将找到的最值与数组首元素的值进行对换的行为。之后将开启新的一轮循环,新数组将从i开始,而i这时加了1,这就代表着新数组往后“缩”了一格,规模变小了一些。重复进行外循环,直到外循环终止,这个数组最终会被排好序。

​ 以上就是选择排序法,要多加练习,才能快速的写出它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

选择排序详解 的相关文章

  • 二叉树和堆(理论)

    树 1 树其实就是不包含回路的连通无向图 2 一棵树中的任意两个结点有且仅有唯一的一条路径连通 3 一棵树如果有n个结点 xff0c 那么它一定恰好有n 1条边 二叉树 二叉树是一种特殊的树 二叉树的特点是每个结点最多有两个儿子 xff0c
  • 十进制转八进制

    给一个十进制数 xff0c 输出它的八进制数 由于取余所得得到数需要逆序输出 xff0c 符合栈的特征 xff08 后进先出 xff09 xff0c 所以使用栈来完成 源代码 xff1a include lt stdio h gt incl
  • 矩阵各项求和

    include span class token generics function span class token punctuation lt span stdio span class token punctuation span
  • 简单易理解的做法:有n个人围成一圈,顺序从1开始排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。简单的循环做法。

    写在前面 xff1a 这个方法用到很简单的指针与循环 xff0c 以方便新手上手该题 xff0c 并且通过直接模拟的方式理解这一过程 很多同学看懂题目意思而无法实现 xff0c 不妨看看我的方法 上代码 xff1a include lt i
  • switch中的i++与++i

    for 语句1 语句2 语句3 在上式for循环的语句3中 xff0c i 43 43 与 43 43 i都是在完成一次循环后执行 xff0c 无论使用哪一种 xff0c 输出结果都是一样的 因为i 43 43 是在使用当前值之后再 43
  • 东北大学秦皇岛分校通信工程中外合作2020级C语言实验5

    1 编写程序 xff0c 定义整型指针变量p xff0c 初始化整型一维数组a的首地址 xff08 数组a的长度为10 xff09 xff0c 利用指针变量p实现从键盘输入10个整型数据到一维数组a中 xff0c 并输出该数组中最大值和最大
  • 东北大学秦皇岛分校通信工程中外合作2020级C语言实验6

    1 定义结构体类型 xff0c 包括候选人名和选票两个成员 xff0c 编程实现对候选人得票的统计 1 Write a C program that implements the statistics of the candidate vo
  • C/CPP三种排序算法

    一 简单选择排序 span class token keyword void span span class token function sort span span class token punctuation span span c
  • ACLGUI IN SSTC(PIA)2020中可能遇到的一些知识点

    文章目录 xff08 一 xff09 条件编译 xff08 二 xff09 部分头文件 xff08 三 xff09 空指针具体操作示例常见问题1 xff1a 空指针指向了内存的什么地方 xff1f 常见问题2 xff1a 在实际的操作中 x
  • 计算机网络基础(一)概述

    计算机网络是一组自治 xff08 拥有独立的计算能力 xff09 计算机互联的集合 IEEE高级委员会 坦尼鲍姆 本文参考书目为 计算机网络 xff08 第七版 xff09 xff08 谢希仁 xff09 书中为方便 xff0c 将计算机网
  • vultr购置配置在线kali

    vultr购置配置kali 购买 这里使用vultr可能需要一个小小的 xff0c 反正我没有 是上不去得 xff0c 大家这里看自己 xff0c 注册好账号我们需要重置 xff0c 这里我们可以选择支付宝进行充值 选择好充值得费用就可以了
  • 华为服务器装CentOS 7系统

    参考文章 https blog csdn net weixin 43897572 article details 98513207 用网线插入服务器网口 xff0c 使用kvm客户端或者浏览器 记录一下华为服务器的默认密码 有进主板的密码
  • c++重学笔记21 - 类型选择器

    喜欢这篇文章吗 xff1f 喜欢的话去看博主的置顶博客 xff0c 即可依据分类找到此文章的原版得到更好的体验 xff0c 图片及代码显示的问题 xff0c 笔者深感抱歉 xff0c 想要更好的体验去原博文即可 title c 43 43
  • Ubuntu 20 安装包下载(清华镜像)

    Ubuntu 20 安装包下载 在国内推荐使用清华大学镜像 清华镜像地址 xff1a https mirrors tuna tsinghua edu cn 在搜索框中输入Ubuntu xff0c 然后点击Ubuntu release xff
  • 今日arXiv精选 | ICCV 2021/CIKM 2021/ACM MM 2021

    关于 今日arXiv精选 这是 AI 学术前沿 旗下的一档栏目 xff0c 编辑将每日从arXiv中精选高质量论文 xff0c 推送给读者 SUNet Symmetric Undistortion Network for Rolling S
  • 在Windows上面安装WSL以使用Linux

    在Windows上面安装WSL以使用Linux 0 WSL xff08 Windows Subsystem for Linux xff09 1 安装Ubuntu步骤1 1 检查Windows版本1 2 激活WSL服务1 3 安装Ubuntu
  • Armbian更新国内软件源|N1盒子复活

    N1刷armbian更新apt xff0c 有的源里缺少很多东西 xff0c 尤其是阿里华为这种源 xff0c arm架构的却少了很多 xff0c 谨慎换源 xff01 xff01 xff01 nano etc apt sources li
  • Qt报错:XXX does not name a type,及解决办法

    一 错误 Qt报错 xff1a XXX does not name a type 二 报错原因 在两个类的头文件中 xff0c 相互引用了对方的头文件 例如 xff1a a h include 34 b h 34 class AClass
  • 成功解决AttributeError: ‘str‘ object has no attribute ‘decode‘

    成功解决AttributeError 39 str 39 object has no attribute 39 decode 39 目录 解决问题 解决思路 解决方法 T1 直接去掉 T2 众多网友好评的建议 解决问题 AttributeE

随机推荐

  • 很实用的latex常用计算符

    本文仅供学习参考使用 xff0c 一切版权和解释权均归原作者所有 xff0c 转载地址 xff1a http blog csdn net garfielder007 article details 51646604 数学符号详细内容见 xf
  • R语言实战——距离判别、贝叶斯判别、Fisher判别理论详细推导与R语言实现

    文章目录 前言1 距离判别1 1 双群体1 1 1 理论推导1 1 2 R语言实现1 1 3 实例分析 1 2 多群体1 2 1 理论推导1 2 2 R语言实现1 2 3 实例分析 2 贝叶斯判别2 1 双群体2 1 1 理论推导2 1 2
  • R语言实战——主成分分析理论推导与R语言实现

    目录 1 总体主成分1 1 主成分的定义与导出1 2 主成分的性质1 3 从相关矩阵出发求主成分 2 样本主成分2 1 从S出发求主成分2 2 从R出发求主成分 3 相关的R函数以及实例3 1 96 princomp 96 函数3 2 96
  • GM(1,1)灰色预测及相关检验指标的MATLAB实现

    本篇文章的代码实现了以下三大方面的功能 xff1a 一 计算级比和光滑比并做级比检验 xff1b 二 序列的灰色预测 xff1b 三 精度检验 xff0c 主要做了以下内容 xff1a 相对残差Q检验 xff08 MAPE xff09 xf
  • R语言实战——ROC曲线的绘制

    前言 xff1a 以前使用Matlab绘制ROC曲线常常是工具箱有就画 xff0c 没有就不画 xff0c 而且在想画的时候工具箱恰恰就没有 xff0c 很纳闷 然后无意间发现了一篇用R语言绘制ROC曲线的文章 xff0c 赶紧学了并分享出
  • 含指数函数的不定积分方法归纳

    本篇博客参照了河北大学数计学院时坚所著的 含指数函数的不定积分方法归纳 xff0c 并在其基础上做了拓展 不定积分为数学分析中一类重要的内容 xff0c 其积分技巧和方法在几百年来一步步得到深入研究和探索 而含指数函数的不定积分为积分学中一
  • MybatisPlus自定义sql分页查询

    自定义sql分页的步骤 Dao层定义查询接口 xff0c 第一个参数必须为分页的参数Ipage xff0c 后面可带其他参数作为传入参数定义自定义查询sql 网上很多博客里面写的多表sql分页查询没带参数 xff0c 这里给一个带参数的列子
  • Error loading “D:\Coding\Anaconda\lib\site-packages\torch\lib\asmjit.dll“

    OSError WinError 126 The specified module could not be found Error loading 34 C Users chunc anaconda3 lib site packages
  • Python实战——VAE的理论详解及Pytorch实现

    参考的论文 xff1a Tutorial on Variational AutoencodersAuto Encoding Variational Bayes 建议参考的文章 xff1a Pytorch里的CrossEntropyLoss详
  • jupyter创建新环境与新kernel

    以下可以参照我的另一篇文章 xff1a Jupyter配置虚拟环境及安装Python包时遇到的问题 创建环境相关 span class token comment 创建环境相关 span span class token comment 创
  • 修改配置文件解决matplotlib中文与正负号乱码问题

    步骤如下 xff1a 1 找到配置文件matplotlibrc 不管是啥系统 xff0c 都可以通过以下方式查找matplotlibrc所在的文件夹 xff08 可以在终端或者编译器中运行以下代码 xff09 span class toke
  • ubuntu查看网络相关信息

    查看ip地址和网卡 xff1a ifconfig 需要确保下载了net tools xff1a sudo apt install net tools 查看DNS xff1a resolvectl status xff08 下图中DNS Se
  • lingo中@size@for@sum函数的使用

    64 size LINGO中的 64 size xff08 xff09 函数用于确定集合中元素的个数 比如你的集合是 注意 xff1a 在使用size的时候直接在 64 size 括号里写上集合名就行 xff0c 不需要写 64 size
  • windows ubuntu18.04 双系统共用蓝牙LE的鼠标

    由于由于双系统的缘故 xff0c 一个蓝牙鼠标并不能无缝的在ubuntu和windows之间切换 由于现在市场上很多是bluetooth LE鼠标 xff0c 所以网上的方法都会失效 这里以华为蓝牙鼠标为例 xff0c 给出一种可行的解决方
  • Apsara Clouder云计算专项技能认证:云服务器ECS入门

    1 xff0e 云服务器ECS以服务化的方式对客户提供 xff0c 阿里云产品售后支持的时间段是 xff1f 单选 A 5 8 B 7 8 C 7 12 D 7 24 2 xff0e 云服务器ECS属于云计算SaaS PaaS laaS哪一
  • Anaconda 下载

    官方下载源 xff08 下载较慢 xff09 xff1a https repo anaconda com archive https repo anaconda com archive 国内下载源 xff08 清华映像站 xff09 xff
  • dpkg: 处理软件包 XXXX (--configure)时出错解决方法

    正在设置 ubuntu drivers common 1 0 4 17 7 var lib dpkg info ubuntu drivers common postinst 21 var lib dpkg info ubuntu drive
  • k8s资源调度

    k8s资源调度 文章目录 k8s资源调度nodeSelectornodeAffinitytainttolerations k8s基本架构如下 Scheduler调度器做为Kubernetes三大核心组件之一 xff0c 承载着整个集群资源的
  • maskrcnn训练自己的数据集报错:ModuleNotFoundError: No module named ‘cityscapesscripts‘

    原因是需要安装cityscapesscripts xff0c 安装地址 xff1a https github com mcordts cityscapesScripts xff0c clone下来之后安装上面的说明进行install pyt
  • 选择排序详解

    选择排序详解 文章目录 选择排序详解1 选择排序算法详解1 药引子 我自己的排序方法2 命根子 选择排序的精髓3 选择排序图解4 总结 2 选择排序的代码详解 摘要 xff1a 选择排序算法是一种比较容易理解的排序算法 xff0c 记得我在