前端算法收集庫

geekjc

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 冒泡排序

算法介紹

解析:

  1. 比較相鄰的兩個元素费变,如果前一個比后一個大摧扇,則交換位置。
  2. 第一輪的時候最后一個元素應該是最大的一個挚歧。
  3. 按照步驟一的方法進行相鄰兩個元素的比較扛稽,這個時候由于最后一個元素已經(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 插入排序

算法介紹

解析:

  1. 從第一個元素開始痴鳄,該元素可以認為已經(jīng)被排序
  2. 取出下一個元素瘟斜,在已經(jīng)排序的元素序列中從后向前掃描
  3. 如果該元素(已排序)大于新元素,將該元素移到下一位置
  4. 重復步驟3痪寻,直到找到已排序的元素小于或者等于新元素的位置
  5. 將新元素插入到下一位置中
  6. 重復步驟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補充常見算法,讓更多的人學習橡类。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蛇尚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子顾画,更是在濱河造成了極大的恐慌佣蓉,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亲雪,死亡現(xiàn)場離奇詭異,居然都是意外死亡疚膊,警方通過查閱死者的電腦和手機义辕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寓盗,“玉大人灌砖,你說我怎么就攤上這事】觯” “怎么了基显?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長善炫。 經(jīng)常有香客問我撩幽,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任窜醉,我火速辦了婚禮宪萄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘榨惰。我一直安慰自己拜英,他們只是感情好,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布琅催。 她就那樣靜靜地躺著居凶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪藤抡。 梳的紋絲不亂的頭發(fā)上侠碧,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機與錄音杰捂,去河邊找鬼舆床。 笑死,一個胖子當著我的面吹牛嫁佳,可吹牛的內(nèi)容都是我干的挨队。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼蒿往,長吁一口氣:“原來是場噩夢啊……” “哼盛垦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瓤漏,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤腾夯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蔬充,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝶俱,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年饥漫,在試婚紗的時候發(fā)現(xiàn)自己被綠了榨呆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡庸队,死狀恐怖积蜻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情彻消,我是刑警寧澤竿拆,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站宾尚,受9級特大地震影響丙笋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一不见、第九天 我趴在偏房一處隱蔽的房頂上張望澳化。 院中可真熱鬧,春花似錦稳吮、人聲如沸缎谷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽列林。三九已至,卻和暖如春酪惭,著一層夾襖步出監(jiān)牢的瞬間希痴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工春感, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留砌创,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓鲫懒,卻偏偏與公主長得像嫩实,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子窥岩,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容