❶ js三大排序算法
冒泡排序思想:让数组中的当前项和后一项进行比较,如果当前项比后一项大的话则两项交换位置,让大的靠后即可。
插入排序思想:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
快速排序思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
❷ 【JS算法】JS数据结构
数组: 是由相同类型的元素的集合所组成的数据结构,分配一块连续的内存来存储。知道第一个元素的内存地址,加上下标(偏移量)就能找到第2或N个。
数组随机访问的速度快,增加和删除则慢(因为删除index2,后面的3-n都要往前挪一位)
链表: 非连续存储的指向型存储,随机访问的速度慢(需一层层查找),增加和删除则快(不需要挪位)
树形结构、图形结构
树形结构又指向其他树点,就是图形结构
图结构,在webpack和vite中有用到,作用是,能找出是否有文件被重复加载
堆和栈
对象是数组+链表的结构
只要是树形结构,解答基本都可以用递归解决
❸ 【JS算法】回溯算法
题目:全排列
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列
输入:nums = [1,2,3] //目标数组
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
这里用回溯是避免重复,导致答案错误
❹ JS常见排序算法
排序算法说明:
(1)对于评述算法优劣术语的说明
稳定 :如果a原本在b前面,而a=b,排序之后a仍然在b的前面;
不稳定 :如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;
内排序 :所有排序操作都在内存中完成;
外排序 :由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;
时间复杂度 : 一个算法执行所耗费的时间。
空间复杂度 : 运行完一个程序所需内存的大小。
(2)排序算法图片总结:
1.冒泡排序:
解析:1.比较相邻的两个元素,如果前一个比后一个大,则交换位置。
2.第一轮的时候最后一个元素应该是最大的一个。
3.按照步骤一的方法进行相邻两个元素的比较,这个时候由于最后一个元素已经是最大的了,所以最后一个元素不用比较。
2.快速排序:
解析:快速排序是对冒泡排序的一种改进,第一趟排序时将数据分成两部分,一部分比另一部分的所有数据都要小。然后递归调用,在两边都实行快速排序。
3.插入排序:
解析:
(1) 从第一个元素开始,该元素可以认为已经被排序
(2) 取出下一个元素,在已经排序的元素序列中从后向前扫描
(3) 如果该元素(已排序)大于新元素,将该元素移到下一位置
(4) 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
(5)将新元素插入到下一位置中
(6) 重复步骤2
2.二分查找:
解析:二分查找,也为折半查找。首先要找到一个中间值,通过与中间值比较,大的放又,小的放在左边。再在两边中寻找中间值,持续以上操作,直到找到所在位置为止。
(1)递归方法
(2)非递归方法
4.选择排序:
解析:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
以此类推,直到所有元素均排序完毕。
5.希尔排序:
解析:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序
6.归并排序:
解析:归并排序是一种稳定的排序方法。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
7.堆排序:
解析:堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是
小于(或者大于)它的父节点。
8.计数排序:
解析:计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。它只能对整数进行排序。
9.桶排序:
解析:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排
10.基数排序:
解析:基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优
先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。基数排序基于分别排序,分别收集,所以是稳定的。
基数排序 vs 计数排序 vs 桶排序
这三种排序算法都利用了桶的概念,但对桶的使用方法上有明显差异:
基数排序:根据键值的每位数字来分配桶 计数排序:每个桶只存储单一键值 桶排序:每个桶存储一定范围的数值
❺ js几种常见的排序算法
原理:比较两个相邻的元素,将值大的元素交换至右端。
思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复第一趟步骤,直至全部排序完成。
N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数。
冒泡排序的优点:每进行一趟排序,就会少比较一次,因为每进行一趟排序都会找出一个较大值。如上例:第一趟比较之后,排在最后的一个数一定是最大的一个数,第二趟排序的时候,只需要比较除了最后一个数以外的其他的数,同样也能找出一个最大的数排在参与第二趟比较的数后面,第三趟比较的时候,只需要比较除了最后两个数以外的其他的数,以此类推……也就是说,没进行一趟比较,每一趟少比较一次,一定程度上减少了算法的量。
冒泡排序优化版:
一.选择排序原理
1.每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置
2.再从剩余未排序元素中继续寻找最小(大)元素,然后放到刚才已排序序列的后面。
3.以此类推,直到全部待排序的数据元素排完。
选择排序是不稳定的排序方法。例如:序列3,3,2,1, 我们知道第一次遍历的时候,选择最后一个元素1和第一个元素3交换,那么原序列中2个3的相对前后顺序就和之前不一样了,所以选择排序不是一个稳定的排序算法。
二.选择排序时间复杂度
第一次循环比较 n - 1次,第二次循环比较 n - 2次,依次类推,最后一个元素不需要比较,因此共进行 n - 1次循环,最后一次循环比较1次。
因此一共比较1 + 2 + 3 + ... +(n - 2)+(n - 1)次,求和得n2/2 - n / 2 ,忽略系数,取最高指数项,该排序的时间复杂度为O(n2)
选择排序优化版:
插入排序:
❻ JS常用的排序算法有哪些,如何实现这些算法
1.冒泡排序
var bubbleSort = function (arr) {
var flag = true;
var len = arr.length;
for (var i = 0; i < len - 1; i++) {
flag = true;
for (var j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
var temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
flag = false;
}
}
if (flag) {
break;
}
}
};
2.选择排序
var selectSort = function (arr) {
var min;
for (var i = 0; i < arr.length-1; i++) {
min = i;
❼ js实现递归算法
<!DOCTYPE >
<html>
<head>
<meta content="" charset="utf-8">
<title>函数的递归调用</title>
</head>
<body>
<script>
//递归的概念:自己调用自己
//注意:使用递归的时候必须有一个结束标志,否则会报内存溢出的错误 Maximum call stack size exceeded;
/* 1.案例一:求1,2,3...n 的和 */
function fn(n){
if(n===1){
return 1;
}
return n+fn(n-1);
}
//console.log(fn(3));
/* 2.案例二:求1,2,3...到n的阶乘 */
function getFactorial(n){
if(n===1){
return 1;
}
return n * getFactorial(n-1);
}
//console.log(getFactorial(3));
/* 案例三:斐波那契数列 *///第n个数等于前两个数的和,除第一个数跟第二个树外:如1,1,2,3,5,8,11,19,30...
function getNFibonacciSequence(n){
if(n===1 || n===2){
return 1;
}
return getNFibonacciSequence(n-1)+getNFibonacciSequence(n-2);
}
console.log(getNFibonacciSequence(4));
</script>
</body>
</html>
❽ 求个JS算法
把三个坐标点放到一个数组里:
vard=[[0,0],[10,0],[5,5]];
然后用个变量i表示A点在数组d中的初始序号:
vari=0;
这样ABC三个点的坐标就是:
vara,b,c
a=d[i];
b=d[(i+1)%3];
c=d[(i+2)%3];
向右旋转时:
a=d[++i%3];
b=d[(i+1)%3];
c=d[(i+2)%3];
向左旋转时:
a=d[--i<0?2:i];
b=d[(i+1)%3];
c=d[(i+2)%3];
❾ 如何用js实现线性回归算法
可以用函数 regress( )来解决。
[b,bint,r,rint,stats] = regress(y,X)
b——拟合线性函数的系数
bint——系数b的置信区间
r——残值向量
rint——残值的置信区间
stats——检验统计量,第一值是回归方程的置信度,第二值是F统计量,第三值是与F统计量相应的p值,当p值很小,说明回归模型成立
X——自变量向量,X=[ones(3,1) x1 x2 x3]
y——应变量向量