一些前端必备数据结构算法

1.快排

function quickSort(arr) {
  if(arr.length<=1) {
  return arr;
}
var s = Math.floor(arr.length/2);
var temp = arr.splice(s,1);
var left=[];
var right=[];
for(var i=0;i<arr.length;i++) {
  if(arr[i]<temp) {
    left.push(arr[i]);
  }
  if(arr[i]>=temp) {
    right.push(arr[i]);
  }
}
return quickSort(left).concat(temp,quickSort(right));
}

2.插入排序

function insertSort(arr) {
  if (Array.isArray(arr)) {
    for (var i = 1; i < arr.length; i++) {
      var preIndex = i - 1;
      var current = arr[i]
      while (preIndex >= 0 && arr[preIndex] > c) {
        arr[preIndex + 1] = arr[preIndex];
        preIndex--;
      }
      arr[preIndex + 1] = current;
    }
    return arr;
  }
}

3.选择排序

function selectSort(arr) {
  if (Array.isArray(arr)) {
    for (var i = 0; i < arr.length - 1; i++) {
      var minIdex = i;
      for (var j = i + 1; j < arr.length; j++) {
        minIdex = arr[j] < arr[minIdex] ? j : minIdex;
      }
      [arr[i], arr[minIdex]] = [arr[minIdex], arr[i]];
    }
    return arr;
  }
}

4.希尔排序

function shellSort(arr) {
  var len = arr.length,temp,gap = 1;
  // 动态定义间隔序列,也可以手动定义,如 gap = 5;
  while (gap < len / 5) {
    gap = gap * 5 + 1;
  }
  for (gap; gap > 0; gap = Math.floor(gap / 5)) {
    for (var i = gap; i < len; i++) {
      temp = arr[i];
      for (var j = i - gap; j >= 0 && arr[j] > temp; j -= gap) {
        arr[j + gap] = arr[j];
      }
      arr[j + gap] = temp;
    }
  }
  return arr;
}

5.数组的扁平化:将多维数组变成一维数组

方法一:递归一
function parseArr(arr,res){
  var i=0;
  for(i=0;i<arr.length;i++){
    if(arr[i] instanceof Array){
      parseArr(arr[i],res);
    }else{
      res.push(arr[i]);
    }
  }
}
var a=[1,[2,[3,4]],5,6];
var res=[];
parseArr(a,res);
递归二(推荐)
var arr = ['mu','zi',['dig',['big','love']]]
function flatten(arr){
  var res = [];
  for(var i=0;i<arr.length;i++){
    if(Array.isArray(arr[i])){
      res = res.concat(flatten(arr[i]));
    }else{
      res.push(arr[i]);
    }
  }
  return res;
}
console.log(flatten(arr))//["mu", "zi", "dig", "big", "love"]

6.树的三种简单遍历

先序遍历
let result = [];
let dfs = function (node) {
  if(node) {
    result.push(node.value);
    dfs(node.left);
    dfs(node.right);
  }
}
中序遍历
let result = [];
let dfs = function (node) {
  if(node) {
    dfs(node.left);
    result.push(node.value); // 直到该结点无左子树 将该结点存入结果数组 接下来并开始遍历右子树
    dfs(node.right);
  }
}
后序遍历
result = [];
function dfs(node) {
  if(node) {
    dfs(node.left);
    dfs(node.right);
    result.push(node.value);
  }
}

 

posted @ 2020-10-06 21:54  桃李子  阅读(263)  评论(0编辑  收藏  举报