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²)

相关文章
|
1月前
|
算法 JavaScript 前端开发
LZH 算法的模拟实现,JavaScript 版本
LZH 算法的模拟实现,JavaScript 版本
|
1月前
|
算法 JavaScript 前端开发
彩票中奖率的真相:用 JavaScript 看透彩票背后的随机算法(下)
至于分发?我们可以参考一下市面上已有的一些概念做一下对比,下面是笼统的一个网络服务器的TPS预估值,也就是说彩票服务器在1秒内可以处理的最大请求数:
|
1月前
|
数据采集 算法 JavaScript
彩票中奖率的真相:用 JavaScript 看透彩票背后的随机算法(上)
原本这篇文章是打算叫「假如我是彩票系统开发者」,但细想一下,如果在文章中引用太多的 JavaScript 的话,反而不是那么纯粹,毕竟也只是我的一厢情愿,彩票开发也不全如本文所讲,有所误导的话便也是得不偿失了。
|
12天前
|
算法 JavaScript 前端开发
在JavaScript中实现基本的碰撞检测算法,我们通常会用到矩形碰撞检测,也就是AABB(Axis-Aligned Bounding Box)碰撞检测
【6月更文挑战第16天】JavaScript中的基本碰撞检测涉及AABB(轴对齐边界框)方法,常用于2D游戏。`Rectangle`类定义了矩形的属性,并包含一个`collidesWith`方法,通过比较边界来检测碰撞。若两矩形无重叠部分,四个条件(关于边界相对位置)均需满足。此基础算法适用于简单场景,复杂情况可能需采用更高级的检测技术或物理引擎库。
48 6
|
1天前
|
算法 JavaScript 安全
一篇文章讲明白JavaScript_提交表单和MD5算法密码加密
一篇文章讲明白JavaScript_提交表单和MD5算法密码加密
|
1天前
|
算法 JavaScript 安全
一篇文章讲明白JavaScript_提交表单和MD5算法密码加密
一篇文章讲明白JavaScript_提交表单和MD5算法密码加密
|
1月前
|
算法 JavaScript 前端开发
三个js算法
三个js算法
12 2
|
1月前
|
算法 JavaScript
js的两个常用算法
js的两个常用算法
12 1
|
1月前
|
JavaScript 前端开发 算法
JavaScript的垃圾回收机制通过标记-清除算法自动管理内存
【5月更文挑战第11天】JavaScript的垃圾回收机制通过标记-清除算法自动管理内存,免除开发者处理内存泄漏问题。它从根对象开始遍历,标记活动对象,未标记的对象被视为垃圾并释放内存。优化技术包括分代收集和增量收集,以提升性能。然而,开发者仍需谨慎处理全局变量、闭包、定时器和DOM引用,防止内存泄漏,保证程序稳定性和性能。
30 0
|
1月前
|
JavaScript 前端开发 算法
【JavaScript技术专栏】使用JavaScript实现常见算法
【4月更文挑战第30天】本文介绍了如何使用JavaScript实现常见算法,包括排序、搜索和图算法。首先,通过JavaScript的`sort`方法讨论了排序算法,以快速排序为例展示了自定义排序的实现。接着,探讨了二分查找这一高效的搜索算法,并提供了实现代码。最后,解释了深度优先搜索(DFS)图算法,并给出了在JavaScript中的实现。理解并运用这些算法能有效提升编程能力。