写点什么

前端培训之常见算法分享

作者:@零度
  • 2022 年 3 月 22 日
  • 本文字数:1627 字

    阅读完需:约 5 分钟

1、排序问题

1.1 冒泡排序

该算法就是依次比较大小,小的的大的进行位置上的交换。

var ex=[8,95,34,21,53,12];

function sortarr(arr){

for(i=0;i<arr.length-1;i++){

for(j=0;j<arr.length-1-i;j++){

if(arr[j]>arr[j+1]){

var temp=arr[j];

arr[j]=arr[j+1];

arr[j+1]=temp;

}

}

}

return arr;

}

sortarr(ex);

console.log(ex);

//当 i=0 的时候,里面的循环完整执行,从 j=0 执行到 j=6,这也就是第一遍排序,结果是将最大的数排到了最后,这一遍循环结束后的结果应该是[8,34,21,53,12,95]

//当 i=1 的时候,里面的循环再次完整执行,由于最大的数已经在最后了,没有必要去比较数组的最后两项,这也是 j<arr.length-1-i 的巧妙之处,结果是[8,34,21,12,53,95]

//说到这里,规律就清楚了,每次将剩下数组里面最大的一个数排到最后面,当第一个循环执行到最后的时候,也就是 i=6,此时,j=0,只需要比较数组的第一和第二项,比较完毕,返回。



1.2 快速排序

//快速排序

var example=[1,4,3,8,9,6,2]

function quickSort(arr){

if(arr.length<=1){

return arr;

}

var left=[],right=[],current=arr.splice(0,1);

for(let i=0;i<arr.length;i++){

if(arr[i]<current){

left.push(arr[i])

}else{

right.push(arr[i])

}

}

return quickSort(left).concat(current,quickSort(right));

}

console.log(quickSort(example)); //[1, 2, 3, 4, 6, 8, 9]

//2.

function quickSort(arr,l,r){

if(l < r){

var i = l, j = r, x = arr[i];

while(i<j){

while(i<j && arr[j]>x)

j--;

if(i<j)

//这里用 i++,被换过来的必然比 x 小,赋值后直接让 i 自加,不用再比较,可以提高效率

arr[i++] = arr[j];

while(i<j && arr[i]<x)

i++;

if(i<j)

//这里用 j--,被换过来的必然比 x 大,赋值后直接让 j 自减,不用再比较,可以提高效率

arr[j--] = arr[i];

}

arr[i] = x;

quickSort(arr, l, i-1);

quickSort(arr, i+1, r);

}

}

1.3 二路归并

将两个按值有序序列合并成一个按值有序序列,则称之为二路归并排序

function marge(left,right){

var result=[];

il=0;

ir=0;

while(il<left.length && ir<right.length){

if(left[il]<right[ir]){

result.push(left[il++]);

}else{

result.push(right[ir++]);

}

}

while(left[il]){

result.push(left[il++]);

}

while(right[ir]){

result.push(right[ir++]);

}

return result;

}

2、二分查找

是在有序数组中用的比较频繁的一种算法,优点是比较次数少,查找速度快、平均性能好;缺点是要求待查表为有序,且插入删除困难_前端培训

// 非递归实现

function binary_search(arr, key) {

var low = 0,

high = arr.length - 1;

while(low <= high){

var mid = parseInt((high + low) / 2);

if(key == arr[mid]){

return mid;

}else if(key > arr[mid]){

low = mid + 1;

}else if(key < arr[mid]){

high = mid -1;

}

}

return -1;

};

//递归实现

function binary_search2(arr, low, high, key) {

if(low > high)

return -1;

var mid = parseInt((low + high)/2);

if(key == arr[mid])

return mid;

else if(key > arr[mid])

return binary_search2(arr, mid+1, high, key);

else if(key < arr[mid])

return binary_search2(arr, low, mid-1, key);

}

算法在前端的地位

算法简单来说,是一门研究计算机性能和资源分配的学科。前端或者说 JS 在算计方面表现得并不优秀,在讲为什么要学习它之前,我想先说说在前端领域什么比算法效率更加重要_web前端培训

比如:

1.安全。web 安全在前端已经占有一定比重,尤其是支付领域等。最常见的就是登录验证码。

2.用户体验。面向用户的东西必须用户体验优先。算法和用户体验也有关联,但通过算法在前端大幅度提高性能导致提高用户体验,是非常少的。

3.模块化和可拓展性。前端需要改代码的情况往往是比较多的,谁都不希望我要修改添加代码的时候会产生连锁反应,我明明要改的只是一个功能一个函数,却不得不因此改十几个函数,这多悲催。

4.语义化和可维护性。代码的可读性也非常重要,程序员很大一部分的时间都是在查修 bug,要是随手写一坨自己回过头都看不懂代码,那多尴尬。

文章来源于大前端私房菜

用户头像

@零度

关注

关注尚硅谷,轻松学IT 2021.11.23 加入

还未添加个人简介

评论

发布
暂无评论
前端培训之常见算法分享_前端算法_@零度_InfoQ写作平台