没错,作为一个菜鸟,我真的不认为前端需要用到算法。
我不是朝后段喊一声,什么都有了么???(黑人问号)
然而实际上,前端还是有一些常用算法的,而且有很多很简单的算法或者实现方法,我从未将其作为一个算法来理解,更不用说理解成前端算法。
排序算法
-
冒泡:复杂度O(n2)
function bubbleSort(arr){ var i = 0, j = 0; for(i=1; i<arr.length; i++){ for(j=0; j<=arr.length-i; j++){ var temp = 0; // ">" 从小到大排序 // "<" 从大到小排序 if(arr[j] > arr[j+1]){ temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } console.log(arr); return arr; } (function main() { var arr = [3,0,9,100,3]; arr = bubbleSort(arr); }());
快速排序:复杂度 O(n2) or O(nlog2n)
// 每次选择最左边的数作为基数
function quickSort(arr){
if (arr.length<2) { return arr; }
// 定义左指针
var left=0;
// 定义右指针
var right=arr.length-1;
//开启每一轮的排序
while(left<right){
// 寻找右边比arr[0]小的数的下标
while(arr[right]>=arr[0] && left<right){
right=right-1;
}
// 寻找左边比arr[0]大的数的下标
while(arr[left]<=arr[0] && left<right){
left++;
}
//当左边指针与右边指针相遇后,交换arr[0]与当前两个指针所在的元素
if (right==left) {
let mid=arr[right];
arr[right]=arr[0];
arr[0]=mid;
break;
}
// 当左指针小于右指针的位置,交换两个指针当前位置的元素
let tem=arr[right];
arr[right]=arr[left];
arr[left]=tem;
}
//递归实现
return quickSort(arr.slice(0,left)).concat(arr.slice(left,right+1)).concat(quickSort(arr.slice(right+1)));
}
-
有序数组合并
function merge(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; }
字符处理
-
生成随机验证
function bubbleSort(n){ var str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; var tmp = ''; for(var i=0;i<n;i++) tmp += str.charAt(Math.round(Math.random()*str.length)); console.log(tmp); return tmp; }
- charAt() 方法可返回指定位置的字符。