web前端开发中经典算法

440 阅读2分钟

数组去重

 let ary = [10, 11, 15, 20, 21, 25, 26, 17, 18, 19, 10, 25];
// 又是一种数组去重的方案
      ary.sort((a, b) => a - b);
      ary = ary.join("@") + "@";
      let reg = /(\d+@)\1*/g;
      arr = [];
      ary.replace(reg, (val, group1) => {
        arr.push(Number(group1.slice(0, group1.length - 1)));
      });
      console.log(arr);

      // 拿出当前项与后面的进行比较
      for (var i = 0; i < ary.length - 1; i++) {
        let item = ary[i];
        let arrs = ary.slice(i + 1);
        let agy = [];
        if (arrs.indexOf(item) > -1) {
          //包含: 我们可以把当前项干掉
          // splice 删除
          // 存在一个问题 原来的数组改变 i++了,会出现数组塌陷的问题
          // arr.splice(i, 1);  第一种
          // i--; // 删除当前项之后,让 i 继续减减操作 解决了数组塌陷的问题
          // arrs[i] = null; 第二种
          // ary[i] = ary[ary.length - 1];
          // ary.length--;
          // i--;  第三种
        }
      }
      // ary = ary.filter(item => item !== null);

冒泡排序

原理 : 一轮轮的比较 每一轮都从第一项开始,拿出当前项和后一项进行比较 如果 A>B 则进行交换位置. 每一次比较都会有一个最大的一项排到后面去

 function bubble(ary) {
        let temp = null;
        //  外层循坏I控制比较的轮数
        for (let i = 0; i < ary.length - 1; i++) {
          for (let j = 0; j < ary.length - 1 - i; j++) {
            if (ary[j] > ary[j + 1]) {
              // 当前项目大于后一项
              temp = ary[j];
              ary[j] = ary[j + 1];
              ary[j + 1] = temp;
            }
          }
        }
        return ary;
      }
      let ary = [12, 10, 5, 17, 19, 12, 5];
      ary = bubble(ary);
      console.log(ary);

快速排序的思路:

  // 容器 => 手  先抓一张 8,新抓的牌比手里的某张牌大, 则把当前的牌放到手里这张牌的后面
  //  12
  // 8 12
  // 8 12 24
  // 8 12 16 24
  // 比到头都没有发现比他更小的,直接放在手里第一个位置即可
  代码如下:
  ```
   //  快速排序:
  function quick(ary) {
    // 4. 结束递归(当ary的length小于等于一项,则不用处理)
    if (ary.length <= 1) {
      return ary;
    }
    // 1. 找到数组的中间项,在原有的数组中把它移除
    let middleIndex = Math.floor(ary.length / 2);
    let middleValue = ary.splice(middleIndex, 1)[0];

    //2. 准备左右两个数组,循坏剩下的数组的每一项, 比当前项小的放到左边的数组中
    // 反之放到右边的数组中
    let aryLeft = [];
    aryRight = [];

    for (let i = 0; i < ary.length; i++) {
      let item = ary[i];
      item < middleValue ? aryLeft.push(item) : aryRight.push(item);
    }

    return quick(aryLeft).concat(middleValue, quick(aryRight));
  }
  let ary = [12, 8, 15, 16, 11, 24];
  quick(ary);
  ```