JavaScript常见的排序算法详解

简介: JavaScript常见的排序算法详解

冒泡排序
冒泡排序的实质就是将数组的相邻项进行比对,如果前一个比后一个大,就交换位置。

冒泡排序需要两层的循环,第一层循环负责比对的轮次,第二层负责相邻位置对比的次数。

比如一个最坏情况的数组为 arr = [4,3,2,1],按照从小到大排序:

第一轮交换的过程依次为:[3,4,2,1]、[3,2,4,1]、[3,2,1,4]
第二轮交换的过程依次为:[2,3,1,4]、[2,1,3,4]
第三轮交换的过程依次为:[1,2,3,4]
可以发现一个规律,比较次数+当次轮数 = 数组的长度

代码如下:

function bubbleSort (arr){
let length = arr.length
for(let i = 0 ; i arr[j+1]){
temp = arr[j]
arr[j] = arr[j+1]
arr[j+1] = temp
}
}
}
return arr
}
冒泡排序的比较次数可以依次推倒为:

比如4个数字的排序,第一轮比较3次,第二轮比较2次,第三轮比较1次
比较总次数为:3+2+1
n个数字,比较次数为 (n-1)+(n-2)+ …… + 1 = n*(n-1)/2
去除常项只保留最高阶项
比较次数为:O( n² )
冒泡排序的交换次数:

假定两次比较会交换一次,取一个平均值,为n*(n-1)/2 /2
去除常项只保留最高阶项
交换次数为:O( n² )

选择排序
选择排序的实质:

第一步,设置一个min最小索引值,一般从0开始

第二步,arr[min]和未排序项进行比对,把比arr[min]小的项的索引值,改为新的最小索引值

第三步,将新的最小索引值的位置和未排序的起始位置进行交换,重复以上过程

function selectionSort(arr){
let temp , min = 0
for( let j = 0 ; j< arr.length ; i++){
for( let i = min + 1 ; i < arr.length ; i++ ){
if( arr[min] > arr[i] ){
min = i
}
}
temp = arr[min]
arr[min] = arr[0]
arr[0] = temp
}
}

选择排序的比较次数O(n²)
//代码效果参考:http://www.zidongmutanji.com/bxxx/537562.html
选择排序的交换次数O(n)

插入排序
插入排序就像在打扑克牌,欢乐斗地主,按照从小到到从左到右的顺序将牌进行排列。

在一个无序的序列中,先把第一个元素当做已排序序列,剩余当做未排序序列。

然后遍历未排序的序列,依次和第一个元素进行比对。如果元素较小,就将其移至前方。这里可以使用while循环。

function insertSort(arr){
for(let i = 1;i0){
arr[j] = arr[j-1]
j--
}
arr[j]=temp
}
return arr
}
插入排序最多的比较次数为:(1+2+...+N-1)/2 = N*(N-1)/4

插入排序的复制次数:N*(N-1)/4

时间复杂度为O(n²)

相关文章
|
8月前
|
运维 监控 JavaScript
内网网管软件中基于 Node.js 的深度优先搜索算法剖析
内网网管软件在企业网络中不可或缺,涵盖设备管理、流量监控和安全防护。本文基于Node.js实现深度优先搜索(DFS)算法,解析其在网络拓扑遍历中的应用。通过DFS,可高效获取内网设备连接关系,助力故障排查与网络规划。代码示例展示了图结构的构建及DFS的具体实现,为内网管理提供技术支持。
125 11
|
5月前
|
监控 算法 JavaScript
基于 JavaScript 图算法的局域网网络访问控制模型构建及局域网禁止上网软件的技术实现路径研究
本文探讨局域网网络访问控制软件的技术框架,将其核心功能映射为图论模型,通过节点与边表示终端设备及访问关系。以JavaScript实现DFS算法,模拟访问权限判断,优化动态策略更新与多层级访问控制。结合流量监控数据,提升网络安全响应能力,为企业自主研发提供理论支持,推动智能化演进,助力数字化管理。
115 4
|
5月前
|
监控 算法 JavaScript
公司局域网管理视域下 Node.js 图算法的深度应用研究:拓扑结构建模与流量优化策略探析
本文探讨了图论算法在公司局域网管理中的应用,针对设备互联复杂、流量调度低效及安全监控困难等问题,提出基于图论的解决方案。通过节点与边建模局域网拓扑结构,利用DFS/BFS实现设备快速发现,Dijkstra算法优化流量路径,社区检测算法识别安全风险。结合WorkWin软件实例,展示了算法在设备管理、流量调度与安全监控中的价值,为智能化局域网管理提供了理论与实践指导。
128 3
|
7月前
|
算法 JavaScript 前端开发
Javascript常见算法详解
本文介绍了几种常见的JavaScript算法,包括排序、搜索、递归和图算法。每种算法都提供了详细的代码示例和解释。通过理解这些算法,你可以在实际项目中有效地解决各种数据处理和分析问题。
247 21
|
7月前
|
监控 算法 JavaScript
企业用网络监控软件中的 Node.js 深度优先搜索算法剖析
在数字化办公盛行的当下,企业对网络监控的需求呈显著增长态势。企业级网络监控软件作为维护网络安全、提高办公效率的关键工具,其重要性不言而喻。此类软件需要高效处理复杂的网络拓扑结构与海量网络数据,而算法与数据结构则构成了其核心支撑。本文将深入剖析深度优先搜索(DFS)算法在企业级网络监控软件中的应用,并通过 Node.js 代码示例进行详细阐释。
116 2
|
7月前
|
存储 算法 JavaScript
基于 Node.js 深度优先搜索算法的上网监管软件研究
在数字化时代,网络环境呈现出高度的复杂性与动态性,上网监管软件在维护网络秩序与安全方面的重要性与日俱增。此类软件依托各类数据结构与算法,实现对网络活动的精准监测与高效管理。本文将深度聚焦于深度优先搜索(DFS)算法,并结合 Node.js 编程语言,深入剖析其在上网监管软件中的应用机制与效能。
95 6
|
7月前
|
JavaScript 前端开发 算法
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
7月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
8月前
|
监控 网络协议 算法
基于问题“如何监控局域网内的电脑”——Node.js 的 ARP 扫描算法实现局域网内计算机监控的技术探究
在网络管理与安全领域,监控局域网内计算机至关重要。本文探讨基于Node.js的ARP扫描算法,通过获取IP和MAC地址实现有效监控。使用`arp`库安装(`npm install arp`)并编写代码,可定期扫描并对比设备列表,判断设备上线和下线状态。此技术适用于企业网络管理和家庭网络安全防护,未来有望进一步提升效率与准确性。
243 8
|
9月前
|
JavaScript 算法 安全
深度剖析:共享文件怎么设置密码和权限的 Node.js 进阶算法
在数字化时代,共享文件的安全性至关重要。本文聚焦Node.js环境,介绍如何通过JavaScript对象字面量构建数据结构管理文件安全信息,包括使用`bcryptjs`库加密密码和权限校验算法,确保高效且安全的文件共享。通过实例代码展示加密与权限验证过程,帮助各行业实现严格的信息资产管理与协作。