沒(méi)錯(cuò),作為一個(gè)菜鳥(niǎo),我真的不認(rèn)為前端需要用到算法。
我不是朝后段喊一聲,什么都有了么???(黑人問(wèn)號(hào))
然而實(shí)際上,前端還是有一些常用算法的,而且有很多很簡(jiǎn)單的算法或者實(shí)現(xiàn)方法,我從未將其作為一個(gè)算法來(lái)理解,更不用說(shuō)理解成前端算法。
排序算法
-
冒泡:復(fù)雜度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); }()); 快速排序:復(fù)雜度 O(n2) or O(nlog2n)
// 每次選擇最左邊的數(shù)作為基數(shù)
function quickSort(arr){
if (arr.length<2) { return arr; }
// 定義左指針
var left=0;
// 定義右指針
var right=arr.length-1;
//開(kāi)啟每一輪的排序
while(left<right){
// 尋找右邊比arr[0]小的數(shù)的下標(biāo)
while(arr[right]>=arr[0] && left<right){
right=right-1;
}
// 尋找左邊比arr[0]大的數(shù)的下標(biāo)
while(arr[left]<=arr[0] && left<right){
left++;
}
//當(dāng)左邊指針與右邊指針相遇后,交換arr[0]與當(dāng)前兩個(gè)指針?biāo)诘脑? if (right==left) {
let mid=arr[right];
arr[right]=arr[0];
arr[0]=mid;
break;
}
// 當(dāng)左指針小于右指針的位置,交換兩個(gè)指針當(dāng)前位置的元素
let tem=arr[right];
arr[right]=arr[left];
arr[left]=tem;
}
//遞歸實(shí)現(xiàn)
return quickSort(arr.slice(0,left)).concat(arr.slice(left,right+1)).concat(quickSort(arr.slice(right+1)));
}
-
有序數(shù)組合并
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; }
字符處理
-
生成隨機(jī)驗(yàn)證
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() 方法可返回指定位置的字符。