前端演算法收集庫

極客教程發表於2018-03-11

前端演算法收集庫

1. 前言

前端演算法程式碼收集庫

旨在幫助大家提高javascript編碼水平,程式碼規範,面對面試官問最難的演算法問題也能從容應對

這是一個常見的js演算法面試題收集庫,包含測試,歡迎star,如果庫中沒有的演算法,歡迎提issue或者PR,補全。

提到演算法,這裡就要說下時間複雜度。 時間複雜度:演算法的時間複雜度是一個函式,描述了演算法的執行時間。時間複雜度越低,效率越高。

2. 關於程式碼規範

俗話說,無規矩不成方圓,所以平時一定要養成良好的編碼習慣

3. 關於程式碼測試

學習測試和持續整合(Continuous Integration,簡稱CI,意思是,在一個專案中,任何人對程式碼庫的任何改動,都會觸發CI伺服器自動對專案進行構建,自動執行測試,甚至自動部署到測試環境。這樣做的好處就是,隨時發現問題,隨時修復。因為修復問題的成本隨著時間的推移而增長,越早發現,修復成本越低)。

4. 常見演算法

4.1 二分查詢

演算法介紹

二分法查詢,也稱折半查詢,是一種在有序陣列中查詢特定元素的搜尋演算法。查詢過程可以分為以下步驟: (1)首先,從有序陣列的中間的元素開始搜尋,如果該元素正好是目標元素(即要查詢的元素),則搜尋過程結束,否則進行下一步。 (2)如果目標元素大於或者小於中間元素,則在陣列大於或小於中間元素的那一半區域查詢,然後重複第一步的操作。 (3)如果某一步陣列為空,則表示找不到目標元素。

參考程式碼:

非遞迴演算法

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. 按照步驟一的方法進行相鄰兩個元素的比較,這個時候由於最後一個元素已經是最大的了,所以最後一個元素不用比較。

js程式碼實現

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程式碼實現 解析:快速排序是對氣泡排序的一種改進,第一趟排序時將資料分成兩部分,一部分比另一部分的所有資料都要小。然後遞迴呼叫,在兩邊都實行快速排序。

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. 從第一個元素開始,該元素可以認為已經被排序
  2. 取出下一個元素,在已經排序的元素序列中從後向前掃描
  3. 如果該元素(已排序)大於新元素,將該元素移到下一位置
  4. 重複步驟3,直到找到已排序的元素小於或者等於新元素的位置
  5. 將新元素插入到下一位置中
  6. 重複步驟2

js程式碼實現

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補充常見演算法,讓更多的人學習。

相關文章