壹 ❀ 引

我在 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];
  • 第二次遍历
    • 找到最小元素2,由于第一项一定是最小,2又在第一项后面,不需要交换。
  • 第三次遍历
    • 找到最小元素3,与4交换位置,得到数组[1,2,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 这一次彻底理解选择排序的更多相关文章

  1. 排序算法c语言描述---选择排序

    排序算法系列学习,主要描述冒泡排序,选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等排序进行分析. 文章规划: 一.通过自己对排序算法本身的理解,对每个方法写个小测试程序. 具体思路分析 ...

  2. 排序算法——选择排序(js语言实现)

    选择排序:顾名思义选择,选择排序属于O(N^2)的排序算法,意思就是选择数组中的最小的拿出来放在第一位,然后再剩下的数里面,选择最小的,排在第二位,以此类推. 例如:8  3  4  5  6  2  ...

  3. js中常见的数组排序算法-冒泡排序和选择排序

    reverse( )  数组逆序   // reverse() 数组逆序 var arr = ["边境牧羊犬", "德国牧羊犬", "金毛" ...

  4. 冒泡排序算法和简单选择排序算法的js实现

    之前已经介绍过冒泡排序算法和简单选择排序算法和原理,现在有Js实现. 冒泡排序算法 let dat=[5, 8, 10, 3, 2, 18, 17, 9]; function bubbleSort(d ...

  5. C++ 选择排序的理解

    #include<stdio.h> #include <iostream> using namespace std; void swap(int *a, int *b) //元 ...

  6. JS排序算法--冒泡排序和选择排序

    在我们JS语法当中,数据类型中的复杂数据类型,有一项我们常用的数组数据类型,其中存储的数据有时是乱序的,需要排序,我们有多种方法,最简单的肯定是 :变量.sort(fonction(a,b){a> ...

  7. 使用 js 实现十大排序算法: 选择排序

    使用 js 实现十大排序算法: 选择排序 选择排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  8. js【生成规定数量不重复随机数】、【冒泡排序】、【鸡尾酒排序】、【选择排序】、【插入排序】、【未完工的二分插入排序】------【总结】

    [生成规定数量不重复随机数] function creatRandom( num ){ var randomLen = num, ranArr = [], thisRan = null, whileO ...

  9. JS快速排序 希尔排序 归并排序 选择排序

    /* 快速排序 1.1 算法描述 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用.快速排序是一种既不浪费空间又可以快一 ...

  10. JS实现选择排序

    function selectSort(arr){ var len=arr.length; var temp; for(var i=0;i<len-1;i++){ for(var j=i+1;j ...

随机推荐

  1. 机器学习-决策树系列-决策树-ID3算法 -C4.5算法-26

    目录 1. 决策树 2. 举个例子 计算信息增益 3. C4.5算法 1. 决策树 决策树是属于有监督机器学习的一种,起源非常早,符合直觉并且非常直观, 模型生成:通过大量数据生成一颗非常好的树,用这 ...

  2. @RequestParam与@RequestBody使用对比

    转载请注明出处: @RequestParam 用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容. (Http协议中,如果不指定Con ...

  3. Visual Studio实用的搜索、查找、替换技巧

    前言 对于.NET开发者而言Visual Studio是我们日常工作中比较常用的开发工具,掌握一些Visual Studio实用的搜索.查找.替换技巧可以帮助我们大大提高工作效率从而避免996. Vi ...

  4. 问题--flask无法发邮件,无法登录

    1.问题 早上测试项目的时候,一直无法正确发送邮件,无法接收,但是查不出原因是什么 2.解决 改变了一下思路,去登录了不需要邮件验证码的用户,发现错误 这个错误提示是一个数据库连接错误,表明应用程序无 ...

  5. [kubernetes]服务健康检查

    前言 进程在运行,但是不代表应用是正常的,对此pod提供的探针可用来检测容器内的应用是否正常.k8s对pod的健康状态可以通过三类探针来检查:LivenessProbe.ReadinessProbe和 ...

  6. MySQL高可用搭建方案之(MHA)

    有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 原文地址 MHA架构介绍 MHA是Master High Av ...

  7. [转帖]Nginx中absolute_redirect、port_in_redirect配置简述

    一.背景: 我们在访问nginx代理下的项目前端页面时,经常会有访问链接最末尾带不带'/'的问题,当我们访问http://xxxx/home时,如果匹配不到location,会自动加上端口port以及 ...

  8. [粘贴]关于preparedStatement

    作者:wuxinliulei链接:https://www.zhihu.com/question/37043270/answer/83914933来源:知乎著作权归作者所有.商业转载请联系作者获得授权, ...

  9. [转帖]Linux系统管理-crond、chkconfig、systemd、unit、target

    https://cloud.tencent.com/developer/article/1409845 10.23 linux任务计划cron crontab命令被用来提交和管理用户的需要周期性执行的 ...

  10. [转帖]Region 性能调优

    https://docs.pingcap.com/zh/tidb/v6.5/tune-region-performance 本文介绍了如何通过调整 Region 大小等方法对 Region 进行性能调 ...