1. 前言
前端算法代碼收集庫
旨在幫助大家提高javascript編碼水平劝萤,代碼規(guī)范,面對面試官問最難的算法問題也能從容應對
這是一個常見的js算法面試題收集庫慎璧,包含測試床嫌,歡迎star跨释,如果庫中沒有的算法,歡迎提issue或者PR厌处,補全鳖谈。
提到算法,這里就要說下時間復雜度嘱蛋。
時間復雜度:算法的時間復雜度是一個函數(shù)蚯姆,描述了算法的運行時間。時間復雜度越低洒敏,效率越高龄恋。
2. 關于代碼規(guī)范
俗話說,無規(guī)矩不成方圓凶伙,所以平時一定要養(yǎng)成良好的編碼習慣
3. 關于代碼測試
學習測試和持續(xù)集成(Continuous Integration郭毕,簡稱CI,意思是函荣,在一個項目中显押,任何人對代碼庫的任何改動,都會觸發(fā)CI服務器自動對項目進行構(gòu)建傻挂,自動運行測試乘碑,甚至自動部署到測試環(huán)境。這樣做的好處就是金拒,隨時發(fā)現(xiàn)問題兽肤,隨時修復。因為修復問題的成本隨著時間的推移而增長绪抛,越早發(fā)現(xiàn)资铡,修復成本越低)。
4. 常見算法
4.1 二分查找
算法介紹
二分法查找幢码,也稱折半查找笤休,是一種在有序數(shù)組中查找特定元素的搜索算法。查找過程可以分為以下步驟:
(1)首先症副,從有序數(shù)組的中間的元素開始搜索店雅,如果該元素正好是目標元素(即要查找的元素),則搜索過程結(jié)束瓦糕,否則進行下一步底洗。
(2)如果目標元素大于或者小于中間元素,則在數(shù)組大于或小于中間元素的那一半?yún)^(qū)域查找咕娄,然后重復第一步的操作亥揖。
(3)如果某一步數(shù)組為空,則表示找不到目標元素。
參考代碼:
非遞歸算法
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;
}else{
return -1;
}
}
};
var arr=[1,2,3,4,5,6,7,8,9,10,11,23,44,86];
var result=binary_search(arr,10);
alert(result); // 9 返回目標元素的索引值
遞歸算法
function binary_search(arr,low,high,key){
if(low>high){
return -1;
}
var mid=parseInt((high+low)/2);
if(arr[mid]==key){
return mid;
}else if(arr[mid]>key){
high=mid-1;
return binary_search(arr,low,high,key);
}else if(arr[mid]<key){
low=mid+1;
return binary_search(arr,low,high,key);
}
};
var arr=[1,2,3,4,5,6,7,8,9,10,11,23,44,86];
var result=binary_search(arr,0,13,10);
alert(result); // 9 返回目標元素的索引值
4.2 排序
4.2.1 冒泡排序
算法介紹
解析:
- 比較相鄰的兩個元素费变,如果前一個比后一個大摧扇,則交換位置。
- 第一輪的時候最后一個元素應該是最大的一個挚歧。
- 按照步驟一的方法進行相鄰兩個元素的比較扛稽,這個時候由于最后一個元素已經(jīng)是最大的了,所以最后一個元素不用比較滑负。
js代碼實現(xiàn)
function bubble_sort(arr){
for(var i=0;i<arr.length-1;i++){
for(var j=0;j<arr.length-i-1;j++){
if(arr[j]>arr[j+1]){
var swap=arr[j];
arr[j]=arr[j+1];
arr[j+1]=swap;
}
}
}
}
var arr=[3,1,5,7,2,4,9,6,10,8];
bubble_sort(arr);
console.log(arr);
4.2.2快速排序
js代碼實現(xiàn)
解析:快速排序是對冒泡排序的一種改進在张,第一趟排序時將數(shù)據(jù)分成兩部分,一部分比另一部分的所有數(shù)據(jù)都要小矮慕。然后遞歸調(diào)用帮匾,在兩邊都實行快速排序。
function quick_sort(arr){
if(arr.length<=1){
return arr;
}
var pivotIndex=Math.floor(arr.length/2);
var pivot=arr.splice(pivotIndex,1)[0];
var left=[];
var right=[];
for(var i=0;i<arr.length;i++){
if(arr[i]<pivot){
left.push(arr[i]);
}else{
right.push(arr[i]);
}
}
return quick_sort(left).concat([pivot],quick_sort(right));
}
var arr=[5,6,2,1,3,8,7,1,2,3,4,7];
console.log(quick_sort(arr));
4.2.3 插入排序
算法介紹
解析:
- 從第一個元素開始痴鳄,該元素可以認為已經(jīng)被排序
- 取出下一個元素瘟斜,在已經(jīng)排序的元素序列中從后向前掃描
- 如果該元素(已排序)大于新元素,將該元素移到下一位置
- 重復步驟3痪寻,直到找到已排序的元素小于或者等于新元素的位置
- 將新元素插入到下一位置中
- 重復步驟2
js代碼實現(xiàn)
function insert_sort(arr){
var i=1,
j,key,len=arr.length;
for(;i<len;i++){
var j=i;
var key=arr[j];
while(--j>-1){
if(arr[j]>key){
arr[j+1]=arr[j];
}else{
break;
}
}
arr[j+1]=key;
}
return arr;
}
insert_sort([2,34,54,2,5,1,7]);
5. 最后
這個庫暫時只收集了很小的一部分螺句,歡迎留言或者提issue或者PR補充常見算法,讓更多的人學習橡类。