听说你们在家闷得快要发霉了,来点新鲜的吧。集中注意力,让时间过得更快一些!

以下是来自菜鸟教程中的排序过程和动图示意:

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。

再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

重复直到所有元素均排序完毕。

我们来捋一捋,选择排序的主要逻辑为:

  1. 外循环先指定一个数,通常是第一个数
  2. 接着在内循环中将这个外循环指定数与右侧数逐个比较,记录下右侧数当中最小的那位
  3. 左侧为排序好的元素,遂内循环中的比较是外循环指定数不停地与右侧元素进行比较
  4. 内循环时,每次发现比外循环指定数小的数就记录下来,循环结束后记录的数便是右侧最小数
  5. 在内循环结束后将外循环指定数与内循环得出的右侧最小数交换位置
  6. 依此类推,直到外层循环结束

现在有一组需要排序的元素:

[7, 21, 9, 13, 109, 9, 2, 50, 33, -1, 20, 11]

按照选择排序的逻辑外循环指定下标为 0 的第一个数 7,选定后 for 循环将从下标为 0 的元素开始循环。代码表现为:

for i in 0..vectors.len(){}

for 循环从下标为 0 的第一个数 7 开始。在内循环中将这个外循环指定数与右侧数 [21, 9, 13, 109, 9, 2, 50, 33, -1, 20, 11] 逐个比较,当外循环指定数小于左边元素时记录最小值,内循环结束后 vectors[i] 与 vectors[j] 交换位置。本轮最小数为 -1,遂元素组变为:

[-1, 21, 9, 13, 109, 9, 2, 50, 33, 7, 20, 11]

此时进入下一轮外循环,指定下标为 1 的第二个数 21。在内循环中将这个外循环指定数与右侧数 [9, 13, 109, 9, 2, 50, 33, -1, 20, 11] 逐个比较,当外循环指定数小于左边元素时记录最小值,内循环结束后 vectors[i] 与 vectors[j] 交换位置。本轮最小数为 2,遂元素组变为:

[-1, 2, 21, 13, 109, 9, 9, 50, 33, 7, 20, 11]

以此规则类推,元素排序的最终结果为:

[-1, 2, 7, 9, 9, 11, 13, 20, 21, 33, 50, 109]

具体代码实现

首先定义一组元素,并打印:

fn main() {let mut vectors = vec![7, 21, 9, 13, 109, 9, 2, 50, 33, -1, 20, 11];println!("vectors: {:?}", vectors);
}

然后定义排序方法:

fn insert_sort(vectors: &mut Vec<i32>) -> &Vec<i32>{vectors
}

排序方法的外循环是 for 循环:

fn insert_sort(vectors: &mut Vec<i32>) -> &Vec<i32>{for i in 0..vectors.len(){}vectors
}

这里的 index 代表最小值的下标:

fn insert_sort(vectors: &mut Vec<i32>) -> &Vec<i32>{for i in 0..vectors.len(){let mut index = i;}vectors
}

在内循环中的将外循环指定数与右侧数逐个比较,当外循环指定数小于右侧元素时记录右侧元素的下标,否则不动。

不停地与右侧元素比较用 for j in i+1..vectors.len() 和 vectors[j] < vectors[index] 表示;

下标的记录其实可以用交换代替,这样内层 for 循环结束时,index 一定是右侧中小元素的下标;

交换位置无法像 Python 那样 a, b = b, a,只能用 c = a, a = b, b = c 这种加入第三个数的方式倒腾。遂代码如下

fn selection_sort(vectors: &mut Vec<i32>) -> &Vec<i32>{for i in 0..vectors.len(){// 寻找未排序元素中的最小值,即[i, n)中的最小元素let mut index = i;for j in i+1..vectors.len(){if vectors[j] < vectors[index]{index = j;}}let middle = vectors[index];vectors[index] = vectors[i];vectors[i] = middle;}vectors
}

理论的验证

上面的理论看似有理有据令人信服,但究竟对不对呢?

我们可以通过打印程序执行过程中每一轮的轮次、最小值和当前元素组。添加了打印语句的代码如下:

fn selection_sort(vectors: &mut Vec<i32>) -> &Vec<i32>{for i in 0..vectors.len(){// 寻找未排序元素中的最小值,即[i, n)中的最小元素let mut index = i;for j in i+1..vectors.len(){if vectors[j] < vectors[index]{index = j;}}println!("现在是第 {} 轮, 最小值: {}, vectors: {:?}", i, vectors[index], vectors);let middle = vectors[index];vectors[index] = vectors[i];vectors[i] = middle;}vectors
}

代码运行后的打印结果如为:

现在是第 0 轮, 最小值: -1, vectors: [7, 21, 9, 13, 109, 9, 2, 50, 33, -1, 20, 11]
现在是第 1 轮, 最小值: 2, vectors: [-1, 21, 9, 13, 109, 9, 2, 50, 33, 7, 20, 11]
现在是第 2 轮, 最小值: 7, vectors: [-1, 2, 9, 13, 109, 9, 21, 50, 33, 7, 20, 11]
现在是第 3 轮, 最小值: 9, vectors: [-1, 2, 7, 13, 109, 9, 21, 50, 33, 9, 20, 11]
现在是第 4 轮, 最小值: 9, vectors: [-1, 2, 7, 9, 109, 13, 21, 50, 33, 9, 20, 11]
现在是第 5 轮, 最小值: 11, vectors: [-1, 2, 7, 9, 9, 13, 21, 50, 33, 109, 20, 11]
现在是第 6 轮, 最小值: 13, vectors: [-1, 2, 7, 9, 9, 11, 21, 50, 33, 109, 20, 13]
现在是第 7 轮, 最小值: 20, vectors: [-1, 2, 7, 9, 9, 11, 13, 50, 33, 109, 20, 21]
现在是第 8 轮, 最小值: 21, vectors: [-1, 2, 7, 9, 9, 11, 13, 20, 33, 109, 50, 21]
现在是第 9 轮, 最小值: 33, vectors: [-1, 2, 7, 9, 9, 11, 13, 20, 21, 109, 50, 33]
现在是第 10 轮, 最小值: 50, vectors: [-1, 2, 7, 9, 9, 11, 13, 20, 21, 33, 50, 109]
现在是第 11 轮, 最小值: 109, vectors: [-1, 2, 7, 9, 9, 11, 13, 20, 21, 33, 50, 109]

由此可见,理论部分的描述是正确的,即每轮次将右侧元素中的最小值与当前轮次元素的位置交换。

完整的 Rust 选择排序代码如下:

Rust 算法代码仓库地址 github.com/asyncins/ac…

作者:华为云云享专家 韦世东

Rust 算法排位记-选择排序图示与代码实现相关推荐

  1. Rust 算法排位记 - 插入排序的图示和代码实现

    Rust 代码在编写过程中与其它语言的略有不同,因为它的编译器不允许有任何不安全的写法,遂代码编写过程中花费时间最长的莫过于查找编译报错的原因.这样也有好处--代码写好之后,稳定性高得一笔! 以下是来 ...

  2. python算法与数据结构-选择排序算法(33)

    阅读目录 一.选择排序的介绍 二.选择排序的原理 三.选择排序的图解 四.选择排序总结 五.选择排序的python代码实现 六.选择排序的C语言代码实现 七.选择排序的时间复杂度 八.选择排序的稳定性 ...

  3. Java常见排序算法之直接选择排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  4. 排序算法:简单选择排序算法实现及分析

    简单选择排序算法介绍 简单选择排序(Simple Selection Sort)就是通过n-1次关键字排序之间的比较,从n-i+1个记录中选择关键字最小的记录,并和第i(1<=i<=n)记 ...

  5. java选择排序代码_Java排序算法总结之选择排序

    本文实例讲述了Java排序算法总结之选择排序.分享给大家供大家参考.具体分析如下: 选择排序的基本操作就是每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部 ...

  6. Java排序算法之直接选择排序

    Java排序算法之直接选择排序 基本过程:假设一序列为R[0]~R[n-1],第一次用R[0]和R[1]~R[n-1]相比较,若小于R[0],则交换至R[0]位置上.第二次从R[1]~R[n-1]中选 ...

  7. js排序算法详解-选择排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-选择排序 相对于冒泡排序还有一种类似的方法就是选择排序,顾名思义就是选择性排序,什么意思呢? 这么来理解,假设 ...

  8. 《数据结构与算法》实验:排序算法实验比较——选择排序 堆排序

    <数据结构与算法>实验和课程Github资源 <数据结构与算法>实验:线性结构及其应用--算术表达式求值 <数据结构与算法>实验:树型结构的建立与遍历 <数据 ...

  9. 排序算法六:选择排序之直接选择排序

    排序算法六:选择排序之直接选择排序 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 引言 在我的博文<"主宰世界"的10种算法短评& ...

最新文章

  1. HAproxy七层负载均衡介绍
  2. Pycharm、Idea、Goland 官方汉化来了
  3. Python爬虫开发
  4. CRC16算法之三:CRC16-CCITT-MODBUS算法的java实现
  5. python查看电脑配置_怎么查看电脑配置(教你如何查看电脑配置信息和型号)
  6. 分享:skalibs 1.3.0 发布,低级的 C 程序库
  7. 2021电赛备赛(一):2015国赛H题风力摆
  8. 研发管理工程师笔试题
  9. hdu5510 Bazinga(KMP 剪枝) !!
  10. android怎么调textview间距,Android如何设置TextView的行间距、行高。
  11. H.264编码技术(zz)
  12. ffmpeg转码不同分辨率视频
  13. 只需20分钟,免费搭建你的个人网站!
  14. 电子政务软件系统公众服务的研究
  15. SpaceX载人航天飞船点火升空 送4名宇航员去空间站
  16. Power Pivot
  17. ios实例开发精品文章推荐(8.12)11个处理触摸事件和多点触摸的JS库
  18. 领扣问题169. 求众数 python解决方案
  19. 什么是5G? 5G有多牛逼!!!!
  20. zookeeper-3.3.6----伪集群

热门文章

  1. php调用外站数据,dedecms数据库外部调用,两dedecms站点数据远程调用
  2. linux 下 c++ 实现 netstat_Linux下基于签名技术的软件保护之实现流程
  3. Javascript中document.execCommand()的用法
  4. 几个非常有用的iOS学习博客链接
  5. Android中最常用也是最难用的控件——ListView
  6. 20145308刘昊阳 20145302张薇《信息安全系统设计基础》实验五:网络通信 实验报告...
  7. 树状数组萌新讲解+基础习题【一点一滴】
  8. AndroidStudio更改默认编码(不用每次新建项目再更改编码了)
  9. hash-4.hashtable
  10. 根据条件控制参数控件是否显示(可用)