欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  WEB前端

JS中的一些常用基础算法介绍

程序员文章站 2022-02-02 20:31:49
...

1、冒泡排序

function bubbleSort(arr) {

  for(var i = 1, len = arr.length; i < len - 1; ++i) { 

     for(var j = 0; j <= len - i; ++j) {    

       if (arr[j] > arr[j + 1]) {     

        let temp = arr[j];

        arr[j] = arr[j + 1];

        arr[j + 1] = temp;

      }

    }

  }

}


2、插入排序

//插入排序 过程就像你拿到一副扑克牌然后对它排序一样

function insertionSort(arr) {

  var n = arr.length;  

// 我们认为arr[0]已经被排序,所以i从1开始

  for (var i = 1; i < n; i++) {  

// 取出下一个新元素,在已排序的元素序列中从后向前扫描来与该新元素比较大小

    for (var j = i - 1; j >= 0; j--) {   

        if (arr[i] >= arr[j]) { // 若要从大到小排序,则将该行改为if (arr[i] <= arr[j])即可

        // 如果新元素arr[i] 大于等于 已排序的元素序列的arr[j],

        // 则将arr[i]插入到arr[j]的下一位置,保持序列从小到大的顺序

        arr.splice(j + 1, 0, arr.splice(i, 1)[0]);       

        // 由于序列是从小到大并从后向前扫描的,所以不必再比较下标小于j的值比arr[j]小的值,退出循环

        break;  

      } else if (j === 0) {        

      // arr[j]比已排序序列的元素都要小,将它插入到序列最前面

        arr.splice(j, 0, arr.splice(i, 1)[0]);

      }

    }

  } 

   return arr;

}


3、快速排序

//快速排序

function qSort(arr) {

  //声明并初始化左边的数组和右边的数组

  var left = [], right = [];

 //使用数组第一个元素作为基准值

  var base = arr[0];  

 //当数组长度只有1或者为空时,直接返回数组,不需要排序

  if(arr.length <= 1) return arr;  

 //进行遍历

  for(var i = 1, len = arr.length; i < len; i++) {

    if(arr[i] <= base) {    

    //如果小于基准值,push到左边的数组

      left.push(arr[i]);

    } else {    

    //如果大于基准值,push到右边的数组

      right.push(arr[i]);

    }

  }

  //递归并且合并数组元素

  return [...qSort(left), ...[base], ...qSort(right)];

    //return qSort(left).concat([base], qSort(right));}


4.原地分区版快速排序实现

function quickSort(array) {

    function swap(array, i, j) {

       var temp = array[i];

       array[i] = array[j];

       array[j] = temp;

     }

     function partition(array, left, right) {

        var index = left;

        var pivot = array[right]; // 取最后一个数字当做基准值,这样方便遍历

         for (var i = left; i < right; i++) {

             if (array[i] < pivot) {

                 swap(array, index, i);

                 index++;

           }

      }

      swap(array, right, index);        

      return index;

      }

      function sort(array, left, right) {    

          if (left > right) {        

              return;

        }        

        var storeIndex = partition(array, left, right);

        sort(array, left, storeIndex - 1);

        sort(array, storeIndex + 1, right);

    }

    sort(array, 0, array.length - 1);    

    return array;

}



1、回文字符串

//判断回文字符串

function palindrome(str) {

  var reg = /[\W\_]/g;  

  var str0 = str.toLowerCase().replace(reg, "");  

  var str1 = str0.split("").reverse().join("");  

  return str0 === str1;

}


2、翻转字符串

function reverseString(str) {

  return str.split("").reverse().join("");

}


3、字符串中出现最多次数的字符

function findMaxDuplicateChar(str) {

  var cnt = {}, //用来记录所有的字符的出现频次

      c = ''; //用来记录最大频次的字符

  for (var i = 0; i < str.length; i++) {

      var ci = str[i];    

      if (!cnt[ci]) {

      cnt[ci] = 1;

    } else {

      cnt[ci]++;

    }   

      if (c == '' || cnt[ci] > cnt[c]) {

      c = ci;

    }

  }  

      console.log(cnt)  return c;

}



1、数组去重

//数组去重

function uniqueArray(arr) {

  var temp = [];  

  for (var i = 0; i < arr.length; i++) {

      if (temp.indexOf(arr[i]) == -1) {

      temp.push(arr[i])

    }

  } 

      return temp;  

      //or

  return Array.from(new Set(arr));

}


1、二分查找

function binary_search(arr, l, r, v) {

  if (l > r) {  

    return -1;

  }  

   var m = parseInt((l + r) / 2); 

   if (arr[m] == v) {  

    return m;

  } else if (arr[m] < v) {  

       return binary_search(arr, m+1, r, v);

  } else {   

        return binary_search(arr, l, m-1, v);

  }

}

1、深度优先搜索


//深搜 非递归实现

function dfs(node) {

  var nodeList = [];  

  if (node) {  

    var stack = [];

    stack.push(node);   

     while(stack.length != 0) {   

        var item = stack.pop();

      nodeList.push(item);      

        var children = item.children;      

        for (var i = children.length-1; i >= 0; i--) {

             stack.push(children[i]);

      }

    }

  }  return nodeList;

//深搜 递归实现

function dfs(node, nodeList) { 

 if (node) {

    nodeList.push(node);    

 var children = node.children;    

 for (var i = 0; i < children.length; i++) {

      dfs(children[i], nodeList);

    }

  }  

 return nodeList;

}


//广搜 非递归实现

function bfs(node) {

    var nodeList = [];    

    if (node != null) {     

       var queue = [];

       queue.unshift(node);        

       while (queue.length != 0) {     

           var item = queue.shift();

            nodeList.push(item);            

           var children = item.children;           

            for (var i = 0; i < children.length; i++)

                queue.push(children[i]);

        }

    }    

        return nodeList;

}

//广搜 递归实现

var i=0;  

//自增标识符

function bfs(node, nodeList) {  

  if (node) {

      nodeList.push(node);      

  if (nodeList.length > 1) {

        bfs(node.nextElementSibling, nodeList); //搜索当前元素的下一个兄弟元素

      }

      node = nodeList[i++];

      bfs(node.firstElementChild, nodeList); //该层元素节点遍历完了,去找下一层的节点遍历

    }    return nodeList;

}