JS中数据结构与算法---排序算法(Sort Algorithm)实例详解


Posted in Javascript onJune 17, 2019

排序算法的介绍

排序也称排序算法 (Sort Algorithm),排序是将 一组数据依指定的顺序 进行 排列的过程

排序的分类

1)  内部排序 : 指将需要处理的所有数据都加载 到 内部存储器(内存) 中进行排序。

2) 外部排序法: 数据量过大,无法全部加载到内 存中,需要借助 外部存储(文件等) 进行 排序。

常见的排序算法分类

JS中数据结构与算法---排序算法(Sort Algorithm)实例详解

算法的时间复杂度 度量一个程序(算法)执行时间的两种方法

1、事后统计的方法 这种方法可行, 但是有两个问题:一是要想对设计的算法的运行性能进行评测,需要实际运行该程序;

二是所得时间的统计量依赖于计算机的硬件、软件等环境因素 , 这种方式,要在同一台计算机的相同状态下运行,才能比较那个算法速度更快。

2、事前估算的方法 通过分析某个算法的时间复杂度来判断哪个算法更优.

时间频度

时间频度:一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。

举例说明-基本案例

比如计算1-100所有数字之和, 我们设计两种算法:

JS中数据结构与算法---排序算法(Sort Algorithm)实例详解

JS中数据结构与算法---排序算法(Sort Algorithm)实例详解

JS中数据结构与算法---排序算法(Sort Algorithm)实例详解

JS中数据结构与算法---排序算法(Sort Algorithm)实例详解

时间复杂度

1、一般情况下,算法中的基本操作语句的重复执行次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n) / f(n) 的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作 T(n)=O( f(n) ),称O( f(n) )  为算法的渐进时间复杂度,简称时间复杂度。

2、T(n) 不同,但时间复杂度可能相同。 如:T(n)=n²+7n+6 与 T(n)=3n²+2n+2 它们的T(n) 不同,但时间复杂度相同,都为O(n²)。

3、计算时间复杂度的方法:

用常数1代替运行时间中的所有加法常数  T(n)=n²+7n+6 => T(n)=n²+7n+1 修改后的运行次数函数中,只保留最高阶项  T(n)=n²+7n+1 => T(n) = n² 去除最高阶项的系数 T(n) = n² => T(n) = n² => O(n²) 常见的时间复杂度

JS中数据结构与算法---排序算法(Sort Algorithm)实例详解

说明:

常见的算法时间复杂度由小到大依次为: Ο(1)<Ο(log 2 n)<Ο(n)<Ο(nlog 2 n)<Ο(n 2 )<Ο(n 3 )< Ο(n k ) <Ο(2 n ) ,随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低

从图中可见,我们应该尽可能避免使用指数阶的算法

时间复杂度示例介绍 1)常数阶O(1)

无论代码执行了多少行,只要是没有循环等复杂结构,那这个代码的时间复杂度就都是O(1)

JS中数据结构与算法---排序算法(Sort Algorithm)实例详解

上述代码在执行的时候,它消耗的时候并不随着某个变量的增长而增长,那么无论这类代码有多长,即使有几万几十万行,都可以用O(1)来表示它的时间复杂度。

2)对数阶O(log 2 n)

JS中数据结构与算法---排序算法(Sort Algorithm)实例详解

说明:在while循环里面,每次都将 i 乘以 2,乘完之后,i 距离 n 就越来越近了。假设循环x次之后,i 就大于 2 了,此时这个循环就退出了,也就是说 2 的 x 次方等于 n,那么 x = log 2 n也就是说当循环 log 2 n 次以后,这个代码就结束了。因此这个代码的时间复杂度为:O(log 2 n)  。 O(log 2 n) 的这个2 时间上是根据代码变化的,i = i * 3 ,则是 O(log 3 n) .

JS中数据结构与算法---排序算法(Sort Algorithm)实例详解

3)线性阶O(n)

JS中数据结构与算法---排序算法(Sort Algorithm)实例详解

说明:这段代码,for循环里面的代码会执行n遍,因此它消耗的时间是随着n的变化而变化的,因此这类代码都可以用O(n)来表示它的时间复杂度

4)线性对数阶O(nlogN)

JS中数据结构与算法---排序算法(Sort Algorithm)实例详解

说明:线性对数阶O(nlogN) 其实非常容易理解,将时间复杂度为O(logn)的代码循环N遍的话,那么它的时间复杂度就是 n * O(logN),也就是了O(nlogN)

5)平方阶O(n²)

JS中数据结构与算法---排序算法(Sort Algorithm)实例详解

说明:平方阶O(n²) 就更容易理解了,如果把 O(n) 的代码再嵌套循环一遍,它的时间复杂度就是 O(n²),这段代码其实就是嵌套了2层n循环,它的时间复杂度就是 O(n*n),即  O(n²) 如果将其中一层循环的n改成m,那它的时间复杂度就变成了 O(m*n)

6)立方阶O(n³)、K次方阶O(n^k)

说明:参考上面的O(n²) 去理解就好了,O(n³)相当于三层n循环,其它的类似

平均时间复杂度和最坏时间复杂度 平均时间复杂度是指所有可能的输入实例均以等概率出现的情况下,该算法的运行时间。 最坏情况下的时间复杂度称最坏时间复杂度。 一般讨论的时间复杂度均是最坏情况下的时间复杂度。  这样做的原因是:最坏情况下的时间复杂度是算法在任何输入实例上运行时间的界限,这就保证了算法的运行时间不会比最坏情况更长。 平均时间复杂度和最坏时间复杂度是否一致,和算法有关(如图:)。

JS中数据结构与算法---排序算法(Sort Algorithm)实例详解

算法的空间复杂度简介 类似于时间复杂度的讨论,一个算法的空间复杂度(Space Complexity)定义为该算法所耗费的存储空间,它也是问题规模n的函数。 空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。有的算法需要占用的临时工作单元数与解决问题的规模n有关,它随着n的增大而增大,当n较大时,将占用较多的存储单元,例如快速排序和归并排序算法就属于这种情况 在做算法分析时, 主要讨论的是时间复杂度从用户使用体验上看,更看重的程序执行的速度 。一些缓存产品(redis, memcache)和算法(基数排序)本质就是 用空间换时间.

总结

以上所述是小编给大家介绍的JS中数据结构与算法---排序算法(Sort Algorithm)实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
鼠标焦点离开文本框时验证的js代码
Jul 19 Javascript
JS获取图片实际宽高及根据图片大小进行自适应
Aug 11 Javascript
JavaScript编程中的Promise使用大全
Jul 28 Javascript
纯js实现瀑布流布局及ajax动态新增数据
Apr 07 Javascript
JavaScript中style.left与offsetLeft的使用及区别详解
Jun 08 Javascript
使用jQuery Ajax 请求webservice来实现更简练的Ajax
Aug 04 Javascript
vue 使用ref 让父组件调用子组件的方法
Feb 08 Javascript
Auto.js自动收取自己和好友蚂蚁森林能量脚本
Jun 28 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
Dec 16 Javascript
js判断密码强度的方法
Mar 18 Javascript
vue实现编辑器键盘抬起时内容跟随光标距顶位置向上滚动效果
May 28 Javascript
VUE动态生成word的实现
Jul 26 Javascript
详解element-ui设置下拉选择切换必填和非必填
Jun 17 #Javascript
JS实现的字符串数组去重功能小结
Jun 17 #Javascript
JavaScript静态作用域和动态作用域实例详解
Jun 17 #Javascript
深入解析koa之中间件流程控制
Jun 17 #Javascript
深入解读Node.js中的koa源码
Jun 17 #Javascript
学习RxJS之JavaScript框架Cycle.js
Jun 17 #Javascript
javascript系统时间设置操作示例
Jun 17 #Javascript
You might like
Thinkphp3.2.3分页使用实例解析
2016/07/28 PHP
在IIS下安装PHP扩展的方法(超简单)
2017/04/10 PHP
JavaScipt基本教程之前言
2008/01/16 Javascript
Javascript 错误处理的几种方法
2009/06/13 Javascript
JQuery插件fancybox无法在弹出层使用左右键的解决办法
2013/12/25 Javascript
ajax+jQuery实现级联显示地址的方法
2015/05/06 Javascript
jQuery常用样式操作实例分析(获取、设置、追加、删除、判断等)
2016/09/08 Javascript
jQuery实现滚动条滚动到子元素位置(方便定位)
2017/01/08 Javascript
JS日程管理插件FullCalendar中文说明文档
2017/02/06 Javascript
JS模拟实现ECMAScript5新增的数组方法
2017/03/20 Javascript
vue中实现移动端的scroll滚动方法
2018/03/03 Javascript
微信小程序实现折叠展开效果
2018/07/19 Javascript
JavaScript选择排序算法原理与实现方法示例
2018/08/06 Javascript
详解vue axios用post提交的数据格式
2018/08/07 Javascript
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
2019/05/10 Javascript
微信小程序实现搜索功能
2020/03/10 Javascript
Element Card 卡片的具体使用
2020/07/26 Javascript
Python操作MongoDB详解及实例
2017/05/18 Python
python 实现对数据集的归一化的方法(0-1之间)
2018/07/17 Python
selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox)
2018/11/29 Python
Python实现CNN的多通道输入实例
2020/01/17 Python
tensorflow自定义激活函数实例
2020/02/04 Python
PyCharm中配置PySide2的图文教程
2020/06/18 Python
HTML5 FormData 方法介绍以及实现文件上传示例
2017/09/12 HTML / CSS
Topman美国官网:英国著名的国际平价时尚男装品牌
2017/12/22 全球购物
阿尔卡特(中国)的面试题目
2014/08/20 面试题
《我的伯父鲁迅先生》教学反思
2014/02/12 职场文书
经销商订货会主持词
2014/03/27 职场文书
化学专业自荐信
2014/05/28 职场文书
2014学校领导四风问题对照检查材料思想汇报
2014/09/22 职场文书
党支部书记四风问题整改措施
2014/09/24 职场文书
个人作风建设剖析材料
2014/10/11 职场文书
党员个人整改措施
2014/10/24 职场文书
2014年教学工作总结
2014/11/13 职场文书
2015年挂职锻炼个人总结
2015/10/22 职场文书
Springboot如何同时装配两个相同类型数据库
2021/11/17 Java/Android