算法之旅 | 选择排序法

HTML5学堂-码匠:数据快速的计算与排序,与前端页面性能有直接的关系。由于排序的算法有很多,在本次“算法系列”的分享当中,我们先从简单易上手的选择排序法开始,其它的排序算法会随后陆续跟大家一起分享。

算法的基本概念

算法是什么,它有何作用

为解决一个问题而采取的方法和步骤,称为算法。

我们可以把算法看成一本“福字剪纸教程”,其中每一种算法就是剪纸教程中的一种包含“固定步骤”的剪纸方法,使用者只要按照步骤进行剪纸,就可以剪出好看的福字。

之所以有这么多的算法,在于不同算法解决问题的效率各有不同,适合不同的场景。随着问题规模的增长,算法之间的差距会变的不可跨越。提升解决问题的效率,不仅仅依赖于选择快速的硬件,还依赖于选择有效(适合)的算法。

排序的使用场景

针对数组进行从大到小(或从小到大)的排序。例如:管理系统中按照成绩的排序,按阅读量对文章的排序等。

数据快速的计算与排序,与前端页面性能有直接的关系。(譬如在页面中有10000条的数据需要靠JS进行排序,采用不同的算法所消耗的时间差距甚大,直接影响着网站的用户体验)

常见的排序方法

较为常见的排序方法,包括:冒泡排序、选择排序、快速排序、二分法插入排序等。

由于排序的算法有很多,在本次“算法系列”的分享当中,我们先从简单易上手的选择排序法开始,其它的排序算法会随后陆续跟大家一起分享。

选择排序法的基本原理

先找到序列中最小的数,将它和序列中第一个数交换位置;

接下来,在剩下的序列中继续此操作:找到最小的数,将它和序列中的第二个数交换位置;

依此类推,直到将整个序列排序完成。

简言之,选择排序就是 —— 不断地选择剩余序列中的最小者,然后与未排序数列的“第一个”数字交换位置。

案例说明

如下数组中,黑色代表待排序,蓝色代表已排序

实现选择排序的步骤分解

排序次数

排序次数:序列长度 – 1(注意,不是比较次数);

因为序列中的最后一个数不需要再次比较大小,故排序次数为 序列长度 – 1。

找到最小的数

序列中找到最小的数,并记录该数的索引值;

因为minIndex默认开始为0,则第一个数无需与自身比较,所以j = i + 1;

  1. // 遍历序列,找到最小的数
  2. for (var j = i + 1; j < len; j++) {
  3. if (arr[j] < arr[minIndex]) {
  4. // 记录最小数的索引
  5. minIndex = j;
  6. };
  7. };

在排序次数内多次遍历找到最小的数,因此需要再用一个for语句来进行控制。

  1. // 排序次数
  2. for (var i = 0; i < len - 1; i++) {
  3. // 默认最小数的索引为i
  4. minIndex = i;
  5. // 遍历序列,找到最小的数
  6. for (var j = i + 1; j < len; j++) {
  7. if (arr[j] < arr[minIndex]) {
  8. // 记录最小数的索引
  9. minIndex = j;
  10. };
  11. };
  12. };

两数交换位置

利用temp变量,实现两数组元素之间数值的交换,也就是交互位置。

  1. temp = arr[i];
  2. arr[i] = arr[minIndex];
  3. arr[minIndex] = temp;

选择排序法完整代码

  1. var arr = [9, 8, 3, 1, 2, 4],
  2. len = arr.length,
  3. minIndex, temp;
  4. // 排序次数
  5. // HTML5学堂
  6. for (var i = 0; i < len - 1; i++) {
  7. // 默认最小数的索引为i
  8. minIndex = i;
  9. // 遍历剩下的序列,找到最小的数
  10. for (var j = i + 1; j < len; j++) {
  11. if (arr[j] < arr[minIndex]) {
  12. // 记录最小数的索引
  13. minIndex = j;
  14. };
  15. };
  16. // HTML5学堂出品
  17. // 两数交互位置
  18. temp = arr[i];
  19. arr[i] = arr[minIndex];
  20. arr[minIndex] = temp;
  21. };
  22. console.log(arr);

选择排序法的效率

算法复杂度的基本概念

算法复杂度分为时间复杂度和空间复杂度(时间和空间是计算机最重要的资源,因此复杂度分为时间和空间)。

时间复杂度:指执行算法所需要的计算工作量;

空间复杂度:指执行算法所需要的内存空间。

时间复杂度:O(n*n)

时间复杂度是总运算次数表达式中受n的变化影响最大的项(不含系数);

第一次循环比较n-1次,然后是n-2次,n-3次,依此类推,最后一次循环比较1次,总的比较次数和为(n - 1 + 1) * n / 2,即进行比较操作的时间复杂度为O(n^2)

Tips:选择排序的比较次数与序列的初始排序无关。

空间复杂度:O(1)

排序算法需要一个额外的空间(temp变量)来交换元素的位置。

不稳定排序的一种算法

选择排序是一种不稳定排序的算法。

比如:序列[3, 8, 3, 1, 9 ],第一次循环第1个元素3会和1交换,变成[1, 8, 3, 3, 9],此时,原序列中两个3的先后顺序被破坏。

转载于:https://www.cnblogs.com/h5course/p/7577260.html

算法之旅 | 选择排序法相关推荐

  1. 总结c语言基础算法——冒泡排序法和选择排序法

    1.首先无论何种排序方法其最终目的是按要求将所给数据进行排序.而在C语言中可以有很多排序的方法,这里着重介绍的是常用的较为基础和重要的算法--冒泡排序法和选择排序法. 下面将举一个例子进行讲解: 要求 ...

  2. C语言排序方法-----二元选择排序法

    上一篇文章C语言排序方法-----选择排序法中分析了选择排序法,这篇文章分析一下选择排序法的优化算法,二元选择排序法,在选择排序法中每次找一个最大或者最小的数据放到开始位置,那么为了提高效率可以每次比 ...

  3. 经典算法之冒泡排序法与直接选择排序法

    活动地址:21天学习挑战赛 文章目录 一.冒泡排序法 1.基本思想 2.算法步骤 3.代码实践 4.复杂度分析 二.直接选择排序法 1.基本思想 2.算法步骤 3.代码实践 4.复杂度分析 一.冒泡排 ...

  4. 基础排序算法之选择排序法

    一.选择排序法思路:先将最小(大)的元素取出,再在剩下的元素,再将其中最小(大)的取出,每次选择未处理的元素中最小(大)的元素,进行排序.     1.两种思路: ①开辟一个新的数组空间,将比较出来的 ...

  5. 浅谈排序算法:冒泡排序法和选择排序法的区别

    之前学习了冒泡排序法和选择排序法,最近被老师问某个道题用的是什么排序法.自己居然答不出来,才发现自己没有真正弄懂,这两个算法的原理和区别,所以····· 1冒泡排序法 1.1什么是冒泡排序法? 顾名思 ...

  6. 数组排序的选择排序法(算法)

    这是一个数组排序的选择排序法的类SelectionSort,通过选择对换最小值打到排序目的. package algorithm; public class SelectionSort { publi ...

  7. 排序算法——选择排序法(Select Sorting)

    选择排序(Select Sorting) 基本介绍 ​ 选择排序也属于内部排序法,是从预排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的 选择排序思想 ​ 选择排序(Selec ...

  8. c语言选择排序法程序设计,C语言基础之选择排序算法和代码

    在利用C语言进行编写程序的过程中,我们会常常通过算法及其代码来进行相关程序的编写工作.今天课课家笔者先给大家介绍C语言算法中的选择排序算法以及代码.那么到底什么是选择排序算法呢?下面由笔者慢慢道来. ...

  9. 面试官:你都工作3年了,连选择排序法都不会,我怎么能选择你

    面试时,算法经常会遇到,特别是一些常见的算法. 张工毕业3年了,一直在一家创业公司做python开发,最近到某知名互联网公司面试,做了笔试题后,面试官看了觉得还不错,于是想进一步考察张工的编码能力,就 ...

最新文章

  1. 一般熟练盲打需要多久_进口攻略!一般货物进口清关需要多久?如何有效提高清关效率?...
  2. python 消息队列如何接收处理_python使用消息队列RabbitMq(进阶)
  3. 使用 soapUI 测试 REST 服务
  4. 怎么汇报一周开发工作情况_如何在没有经验的情况下获得第一份开发人员工作
  5. 7-5 图形继承与多态 (50 分)
  6. 如果使用 sftp 命令
  7. Chrome扩展开发指南(
  8. 财务人员必备的5个Excel技能,学会工资高出同事3倍!
  9. 欧瑞变频器800参数设置_ACS800系列变频器的参数及设置
  10. 萤火虫小程序_十一爱萌乐园试营业欢乐开启!萤火虫星光夜梦幻来袭!更有…...
  11. 语音合成1700多个中文音频
  12. wdr7660虚拟服务器设置,TP-Link TL-WDR7660路由器密码设置
  13. uni.getUserProfile获取的微信昵称是微信用户,头像获取的是默认头像
  14. Scratch精通之侦测的使用
  15. 如何破解百度文库的防复制功能
  16. asp生成带参数的二维码并合成推广海报图片,asp合并合成推广海报图片asp代码...
  17. 硬件断点和软件断点的区别
  18. CREATE VIEW
  19. 生擒网络剪刀手(NetCut)
  20. 面试必问的网络知识,都在这100道题里了(值得收藏)

热门文章

  1. C#中生成二维码(QR码)与读取二维码内容
  2. 解决参考-微信小程序体验版不开调试工具无法请求数据
  3. java调用hidl_HIDL - anonmous - 博客园
  4. iPhone和android哪个早,用苹果还是安卓,看完你就清楚了
  5. 【Java进阶营】【Kafka技术专题】核心技术原理分析和介绍
  6. 直接甲醇燃料电池,氢燃料电池的完美替代者?
  7. pg加密扩展的安装_服务器安装SG11扩展教程,宝塔安装微擎加密组件SourceGuardian loader...
  8. php替换图片_php如何替换图片地址
  9. 【笔试题】2019海康威视嵌入式软件开发工程师(多媒体智能应用)笔试题(附超详细解答)
  10. Getshell思路总结