JS 这一次彻底理解选择排序
壹 ❀ 引
我在 JS 这一次彻底理解冒泡排序 一文中介绍了十大经典排序中的冒泡排序,所谓冒泡排序就是不断比较相邻的两个元素,让较小的往前浮,较大的往后沉,直到所有元素找到自己对应的位置。那么现在我们接着理解第二种排序--选择排序,每天进步一点点,本文开始。
贰 ❀ 选择排序基本概念
选择排序相对冒泡排序理解起来其实更简单粗暴,首先在未排序的数组中找到最小项,并移动到数组起始位置,之后对其它未排序的元素继续遍历,接着找最小的元素,放在已排序的元素后面,直到所有数组排序完成。

首先第一个问题,怎么知道哪个元素最小呢?有的同学可能想到了Math.min.apply(null,arr)方法,前面我们说了找到最小元素放到数组头部,很明显我们需要知道最小元素的index,这样才能便于利用index交换元素位置。
不卖关子,其实我们可以假设数组的第 i 项最小,遍历并拿 i+1 项与之比较,只要后者比 i 小,将 i 改成当i+1项 的索引即可,例如:
var arr = [4, 2, 1, 3],
len = arr.length,
i = 0,
minIndex = i;
for (; i < len; i++) {
if (arr[i + 1] < arr[minIndex]) {
minIndex = i + 1;
};
};
console.log(minIndex);//2
知道了这一点,我们来简单模拟一次选择排序,假设现在有数组[4,2,1,3];
- 第一次遍历
- 找到最小元素1,与4交换位置,得到数组
[1,2,4,3];
- 找到最小元素1,与4交换位置,得到数组
- 第二次遍历
- 找到最小元素2,由于第一项一定是最小,2又在第一项后面,不需要交换。
- 第三次遍历
- 找到最小元素3,与4交换位置,得到数组
[1,2,3,4]。
- 找到最小元素3,与4交换位置,得到数组
不知道大家有没有看出这样几个规律:
- 每次遍历,一定能确认一个最小项,所以下次遍历时可以跳过这一项,遍历次数越多,下次遍历查找的次数就越少。以上面例子来说,第一次遍历从 i=0开始,遍历完成,下次遍历查找就得从i=1开始。
- 当遍历到length -1次时,剩下的一个元素一定是最大的一个,所以没有再查找的必要。以上面的例子为例,遍历到第三次时,剩下一个4已经是最大,无需下次遍历。
知道了这两个规律,我们来尝试实现选择排序。
叁 ❀ 选择排序实现
function selectionSort(arr) {
var len = arr.length,
i = 0,
minIndex;
// 定义遍历次数,一共只需要遍历length-1次
for (; i < len - 1; i++) {
// 假设的最小项,每遍历一次,假设最小项就会往后推一次,这样就会少查找一次
minIndex = i;
// 与假设最小项比较的一项,自然是i+1项
for (var j = i + 1; j < len; j++) {
arr[j] < arr[minIndex] ? minIndex = j : null;
};
// 确定最小项位置后,把最小项往前排
arr[i] = [arr[minIndex], arr[minIndex] = arr[i]][0];
};
return arr;
};
var arr = [7, 5, 3, 2, 4, 1, 6];
selectionSort(arr); //[1, 2, 3, 4, 5, 6, 7]
需要注意的点已经在代码中通过注释标注了。另外,选择排序无论处理什么样的数据,时间复杂度都是O(n²),所以它只适合处理数据规模不大的场景。
若文中存在描述不当,还望指出,那么到这里,本文结束。
肆 ❀ 参考
JS 这一次彻底理解选择排序的更多相关文章
- 排序算法c语言描述---选择排序
排序算法系列学习,主要描述冒泡排序,选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等排序进行分析. 文章规划: 一.通过自己对排序算法本身的理解,对每个方法写个小测试程序. 具体思路分析 ...
- 排序算法——选择排序(js语言实现)
选择排序:顾名思义选择,选择排序属于O(N^2)的排序算法,意思就是选择数组中的最小的拿出来放在第一位,然后再剩下的数里面,选择最小的,排在第二位,以此类推. 例如:8 3 4 5 6 2 ...
- js中常见的数组排序算法-冒泡排序和选择排序
reverse( ) 数组逆序 // reverse() 数组逆序 var arr = ["边境牧羊犬", "德国牧羊犬", "金毛" ...
- 冒泡排序算法和简单选择排序算法的js实现
之前已经介绍过冒泡排序算法和简单选择排序算法和原理,现在有Js实现. 冒泡排序算法 let dat=[5, 8, 10, 3, 2, 18, 17, 9]; function bubbleSort(d ...
- C++ 选择排序的理解
#include<stdio.h> #include <iostream> using namespace std; void swap(int *a, int *b) //元 ...
- JS排序算法--冒泡排序和选择排序
在我们JS语法当中,数据类型中的复杂数据类型,有一项我们常用的数组数据类型,其中存储的数据有时是乱序的,需要排序,我们有多种方法,最简单的肯定是 :变量.sort(fonction(a,b){a> ...
- 使用 js 实现十大排序算法: 选择排序
使用 js 实现十大排序算法: 选择排序 选择排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!
- js【生成规定数量不重复随机数】、【冒泡排序】、【鸡尾酒排序】、【选择排序】、【插入排序】、【未完工的二分插入排序】------【总结】
[生成规定数量不重复随机数] function creatRandom( num ){ var randomLen = num, ranArr = [], thisRan = null, whileO ...
- JS快速排序 希尔排序 归并排序 选择排序
/* 快速排序 1.1 算法描述 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用.快速排序是一种既不浪费空间又可以快一 ...
- JS实现选择排序
function selectSort(arr){ var len=arr.length; var temp; for(var i=0;i<len-1;i++){ for(var j=i+1;j ...
随机推荐
- offline RL | ABM:从 offline dataset 的好 transition 提取 prior policy
ICLR 2020,6 6 6. 材料: 论文题目:Keep Doing What Worked: Behavior Modelling Priors for Offline Reinforcemen ...
- 安装MicroStation软件、Terrasolid插件的方法
本文介绍在Win10电脑中,安装MicroStation软件与Terrasolid插件合集的详细方法. 首先,我们需要有MicroStation软件与Terrasolid插件合集的安装包:这些 ...
- C:\Keil_v5\ARM\ARMCC\include\stdint.h contains an incorrect path.
1.问题 在使用Keil uvison5打开例程代码进行学习时,发现部分.h文件无法读取 2.解决方法 1.找到如图的设置按钮(小锤子) 2.根据自己所用的是C/C++还是ARM选择(我这里是C/C+ ...
- mysql-数值函数-取整-保留小数位-求余数
- Sonarqube 二进制的安装与简单使用
Sonarqube 二进制的安装与简单使用 背景 使用容器安装 sonarqube 发现无法使用PG数据库 尝试了很长时间没搞定 想了想还是使用 二进制的方式进行部署吧. 下载 https://bin ...
- [转帖]12.24.2 DECIMAL Data Type Characteristics
https://dev.mysql.com/doc/refman/8.0/en/fixed-point-types.html This section discusses the characteri ...
- [转帖]MySQL: Convert decimal to binary
Last Update:2018-12-05 Source: Internet Author: User Tags decimal to binary mysql code Developer on ...
- [转帖]从理论到实践,异步I/O模式下NVMe SSD高性能之道
在早期NVMe的讨论话题中,常常将之AHCI协议进行对比,在支持的最大队列深度.并发进程数以及消耗时钟周期数等方面,NVMe吊打了AHCI.最直观也最权威的就是下面这张对比图片. NVMe与AHCI协 ...
- [转帖]awk命令 去掉重复行
https://developer.aliyun.com/article/885946?spm=a2c6h.24874632.expert-profile.263.7c46cfe9h5DxWK lin ...
- [转帖]Linux中的用户和用户组
https://www.jianshu.com/p/76700505cac4 1,Linux中的用户分类 超级用户:拥有对系统的最高管理权限,默认是root用户. 普通用户:只能对自己目录下的文件进行 ...