• 前端算法收集库


    1. 前言
    前端算法代码收集库
    
    旨在帮助大家提高javascript编码水平,代码规范,面对面试官问最难的算法问题也能从容应对
    
    这是一个常见的js算法面试题收集库,包含测试,欢迎star,如果库中没有的算法,欢迎提issue或者PR,补全。
    提到算法,这里就要说下时间复杂度。
    时间复杂度:算法的时间复杂度是一个函数,描述了算法的运行时间。时间复杂度越低,效率越高。
    2. 关于代码规范
    俗话说,无规矩不成方圆,所以平时一定要养成良好的编码习惯
    
    Code Guide
    在js开发前需要的东西(规范)
    
    3. 关于代码测试
    学习测试和持续集成(Continuous Integration,简称CI,意思是,在一个项目中,任何人对代码库的任何改动,都会触发CI服务器自动对项目进行构建,自动运行测试,甚至自动部署到测试环境。这样做的好处就是,随时发现问题,随时修复。因为修复问题的成本随着时间的推移而增长,越早发现,修复成本越低)。
    
    javascript CI篇
    测试框架 Mocha 实例教程
    karma 测试框架的前世今生
    
    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 冒泡排序
    算法介绍
    解析:
    
    比较相邻的两个元素,如果前一个比后一个大,则交换位置。
    第一轮的时候最后一个元素应该是最大的一个。
    按照步骤一的方法进行相邻两个元素的比较,这个时候由于最后一个元素已经是最大的了,所以最后一个元素不用比较。
    
    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 插入排序
    算法介绍
    解析:
    
    从第一个元素开始,该元素可以认为已经被排序
    取出下一个元素,在已经排序的元素序列中从后向前扫描
    如果该元素(已排序)大于新元素,将该元素移到下一位置
    重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
    将新元素插入到下一位置中
    重复步骤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]);
    
    作者:极客教程
    链接:https://juejin.im/post/5aa4cd1051882577b45ea2c3
    来源:掘金
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    [每日一题2020.06.23]leetcode #16 双指针
    typora+picgo+jsdeliver+github打造免费高效的博客图床
    [javaSE笔记5]String
    [javaSE笔记4] ArrayList
    [javaSE笔记3] JAVA的继承---多态 抽象
    [每日一题2020.06.22]leetcode #11 双指针
    操作系统---设备管理
    [每日一题2020.06.21]leetcode #124 DFS二叉树
    操作系统---磁盘
    PC实用工具推荐
  • 原文地址:https://www.cnblogs.com/hjptopshow/p/11428304.html
Copyright © 2020-2023  润新知