算法之旅 | 选择排序法
算法之旅 | 选择排序法
HTML5学堂-码匠:数据快速的计算与排序,与前端页面性能有直接的关系。由于排序的算法有很多,在本次“算法系列”的分享当中,我们先从简单易上手的选择排序法开始,其它的排序算法会随后陆续跟大家一起分享。
算法的基本概念
算法是什么,它有何作用
为解决一个问题而采取的方法和步骤,称为算法。
我们可以把算法看成一本“福字剪纸教程”,其中每一种算法就是剪纸教程中的一种包含“固定步骤”的剪纸方法,使用者只要按照步骤进行剪纸,就可以剪出好看的福字。
之所以有这么多的算法,在于不同算法解决问题的效率各有不同,适合不同的场景。随着问题规模的增长,算法之间的差距会变的不可跨越。提升解决问题的效率,不仅仅依赖于选择快速的硬件,还依赖于选择有效(适合)的算法。
排序的使用场景
针对数组进行从大到小(或从小到大)的排序。例如:管理系统中按照成绩的排序,按阅读量对文章的排序等。
数据快速的计算与排序,与前端页面性能有直接的关系。(譬如在页面中有10000条的数据需要靠JS进行排序,采用不同的算法所消耗的时间差距甚大,直接影响着网站的用户体验)
常见的排序方法
较为常见的排序方法,包括:冒泡排序、选择排序、快速排序、二分法插入排序等。
由于排序的算法有很多,在本次“算法系列”的分享当中,我们先从简单易上手的选择排序法开始,其它的排序算法会随后陆续跟大家一起分享。
选择排序法的基本原理
先找到序列中最小的数,将它和序列中第一个数交换位置;
接下来,在剩下的序列中继续此操作:找到最小的数,将它和序列中的第二个数交换位置;
依此类推,直到将整个序列排序完成。
简言之,选择排序就是 —— 不断地选择剩余序列中的最小者,然后与未排序数列的“第一个”数字交换位置。
案例说明
如下数组中,黑色代表待排序,蓝色代表已排序
实现选择排序的步骤分解
排序次数
排序次数:序列长度 – 1(注意,不是比较次数);
因为序列中的最后一个数不需要再次比较大小,故排序次数为 序列长度 – 1。
找到最小的数
序列中找到最小的数,并记录该数的索引值;
因为minIndex默认开始为0,则第一个数无需与自身比较,所以j = i + 1;
- // 遍历序列,找到最小的数
- for (var j = i + 1; j < len; j++) {
- if (arr[j] < arr[minIndex]) {
- // 记录最小数的索引
- minIndex = j;
- };
- };
在排序次数内多次遍历找到最小的数,因此需要再用一个for语句来进行控制。
- // 排序次数
- for (var i = 0; i < len - 1; i++) {
- // 默认最小数的索引为i
- minIndex = i;
- // 遍历序列,找到最小的数
- for (var j = i + 1; j < len; j++) {
- if (arr[j] < arr[minIndex]) {
- // 记录最小数的索引
- minIndex = j;
- };
- };
- };
两数交换位置
利用temp变量,实现两数组元素之间数值的交换,也就是交互位置。
- temp = arr[i];
- arr[i] = arr[minIndex];
- arr[minIndex] = temp;
选择排序法完整代码
- var arr = [9, 8, 3, 1, 2, 4],
- len = arr.length,
- minIndex, temp;
- // 排序次数
- // HTML5学堂
- for (var i = 0; i < len - 1; i++) {
- // 默认最小数的索引为i
- minIndex = i;
- // 遍历剩下的序列,找到最小的数
- for (var j = i + 1; j < len; j++) {
- if (arr[j] < arr[minIndex]) {
- // 记录最小数的索引
- minIndex = j;
- };
- };
- // HTML5学堂出品
- // 两数交互位置
- temp = arr[i];
- arr[i] = arr[minIndex];
- arr[minIndex] = temp;
- };
- 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
算法之旅 | 选择排序法相关推荐
- 总结c语言基础算法——冒泡排序法和选择排序法
1.首先无论何种排序方法其最终目的是按要求将所给数据进行排序.而在C语言中可以有很多排序的方法,这里着重介绍的是常用的较为基础和重要的算法--冒泡排序法和选择排序法. 下面将举一个例子进行讲解: 要求 ...
- C语言排序方法-----二元选择排序法
上一篇文章C语言排序方法-----选择排序法中分析了选择排序法,这篇文章分析一下选择排序法的优化算法,二元选择排序法,在选择排序法中每次找一个最大或者最小的数据放到开始位置,那么为了提高效率可以每次比 ...
- 经典算法之冒泡排序法与直接选择排序法
活动地址:21天学习挑战赛 文章目录 一.冒泡排序法 1.基本思想 2.算法步骤 3.代码实践 4.复杂度分析 二.直接选择排序法 1.基本思想 2.算法步骤 3.代码实践 4.复杂度分析 一.冒泡排 ...
- 基础排序算法之选择排序法
一.选择排序法思路:先将最小(大)的元素取出,再在剩下的元素,再将其中最小(大)的取出,每次选择未处理的元素中最小(大)的元素,进行排序. 1.两种思路: ①开辟一个新的数组空间,将比较出来的 ...
- 浅谈排序算法:冒泡排序法和选择排序法的区别
之前学习了冒泡排序法和选择排序法,最近被老师问某个道题用的是什么排序法.自己居然答不出来,才发现自己没有真正弄懂,这两个算法的原理和区别,所以····· 1冒泡排序法 1.1什么是冒泡排序法? 顾名思 ...
- 数组排序的选择排序法(算法)
这是一个数组排序的选择排序法的类SelectionSort,通过选择对换最小值打到排序目的. package algorithm; public class SelectionSort { publi ...
- 排序算法——选择排序法(Select Sorting)
选择排序(Select Sorting) 基本介绍 选择排序也属于内部排序法,是从预排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的 选择排序思想 选择排序(Selec ...
- c语言选择排序法程序设计,C语言基础之选择排序算法和代码
在利用C语言进行编写程序的过程中,我们会常常通过算法及其代码来进行相关程序的编写工作.今天课课家笔者先给大家介绍C语言算法中的选择排序算法以及代码.那么到底什么是选择排序算法呢?下面由笔者慢慢道来. ...
- 面试官:你都工作3年了,连选择排序法都不会,我怎么能选择你
面试时,算法经常会遇到,特别是一些常见的算法. 张工毕业3年了,一直在一家创业公司做python开发,最近到某知名互联网公司面试,做了笔试题后,面试官看了觉得还不错,于是想进一步考察张工的编码能力,就 ...
最新文章
- 一般熟练盲打需要多久_进口攻略!一般货物进口清关需要多久?如何有效提高清关效率?...
- python 消息队列如何接收处理_python使用消息队列RabbitMq(进阶)
- 使用 soapUI 测试 REST 服务
- 怎么汇报一周开发工作情况_如何在没有经验的情况下获得第一份开发人员工作
- 7-5 图形继承与多态 (50 分)
- 如果使用 sftp 命令
- Chrome扩展开发指南(
- 财务人员必备的5个Excel技能,学会工资高出同事3倍!
- 欧瑞变频器800参数设置_ACS800系列变频器的参数及设置
- 萤火虫小程序_十一爱萌乐园试营业欢乐开启!萤火虫星光夜梦幻来袭!更有…...
- 语音合成1700多个中文音频
- wdr7660虚拟服务器设置,TP-Link TL-WDR7660路由器密码设置
- uni.getUserProfile获取的微信昵称是微信用户,头像获取的是默认头像
- Scratch精通之侦测的使用
- 如何破解百度文库的防复制功能
- asp生成带参数的二维码并合成推广海报图片,asp合并合成推广海报图片asp代码...
- 硬件断点和软件断点的区别
- CREATE VIEW
- 生擒网络剪刀手(NetCut)
- 面试必问的网络知识,都在这100道题里了(值得收藏)
热门文章
- C#中生成二维码(QR码)与读取二维码内容
- 解决参考-微信小程序体验版不开调试工具无法请求数据
- java调用hidl_HIDL - anonmous - 博客园
- iPhone和android哪个早,用苹果还是安卓,看完你就清楚了
- 【Java进阶营】【Kafka技术专题】核心技术原理分析和介绍
- 直接甲醇燃料电池,氢燃料电池的完美替代者?
- pg加密扩展的安装_服务器安装SG11扩展教程,宝塔安装微擎加密组件SourceGuardian loader...
- php替换图片_php如何替换图片地址
- 【笔试题】2019海康威视嵌入式软件开发工程师(多媒体智能应用)笔试题(附超详细解答)
- Getshell思路总结