zoukankan      html  css  js  c++  java
  • 23-js算法入门之四种基础排序

    一、冒泡排序

    就是两两之间 相互比较 前面的大于后面的则交换 重复这个操作。

    UTOOLS1588076288729.png

      <script>
        function Bubbles(arr) {
          // 1.外层控制排序的轮数
          for (let i = 0; i < arr.length - 1; i++) {
            // 5.设置一个开关
            let flag = true;
            // 2.内层控制每一轮进行的次数
            for (let j = 0; j < arr.length - 1 - i; j++) {
              // 3.比较时,如果前面的大于后面的项,就交换位置
              if (arr[j] > arr[j + 1]) {
                // 6.当这一轮发生了变量交换,说明此轮还未排好序,下一轮继续循环
                flag = false;
                let temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
              }
            }
            // 7.如果这一轮没有发生任何交换,代表数组已排序完毕,后面的就不用执行了,就跳出当前循环
            if (flag === true) {
              break;
            }
          }
          return arr;
        }
        let res = Bubbles([12, 4, 65, 98, 7, 66]);
        console.log(res);
      </script>
    
    1.交换两个变量的几种方法
      <script>
        var a = 10;
        var b = 20;
    
        //山顶洞人方法
        // var temp = a;
        // a = b;
        // b = temp;
        // console.log(`a:${a},b:${b}`);//a:20,b:10
    
        // 方法二、运算符
        // var a = a + b;
        // var b = a - b;
        // var a = a - b;
        // console.log(`a:${a},b:${b}`);//a:20,b:10
    
    
        // 方法三,es6数据解构
        // [a, b] = [b, a]
        // console.log(`a:${a},b:${b}`);//a:20,b:10
    
        // 方法四,妙啊
        // =号优先级高于,
        // 先把a赋值给b,在把b给a
        a = [b, b = a][0];
        console.log(`a:${a},b:${b}`);//a:20,b:10
      </script>
    

    二、插入排序

    UTOOLS1588076335908.png

      <script>
        function Insert(arr) {
          // 1.创建一个空数组,用来返回排序号的结果
          let newArr = [];
          // 2.将数组中的第0项添加进去
          newArr.push(arr[0]);
          // 3.第0项不需要比较,从1开始即可
          for (let i = 1; i < arr.length; i++) {
            // 4.从后往前比较
            for (let j = newArr.length - 1; j >= 0; j--) {
              // 5.如果原数组中的项目大于新数组中的
              if (arr[i] > newArr[j]) {
                // 就把新数放在原数的后面
                newArr.splice(j + 1, 0, arr[i]);
                //这一个就不管了,结束
                break;
              }
              // 6.当比到第一项了,就直接放进去
              if (j === 0) {
                newArr.unshift(arr[i]);
              }
            }
          }
          return newArr;
        }
    
        let res = Insert([1, 5, 9, 77, 66, 22, 45]);
        console.log(res);
      </script>
    

    三、选择排序

    就是先假设第一个是最小的,循环遍历,将第一个与所有的比较,当有人比他大,就把那个数的索引值换成最小索引值,再进行比较,这样每一轮都会得到一个最小值,知道length-1轮执行完毕,排序完毕
    UTOOLS1588076362484.png

      <script>
        function Select(arr) {
          // 1.外层循环控制次数
          for (var i = 0; i < arr.length - 1; i++) {
            // 2.假设第i个是最小
            var minIndex = i;
            // 3.j从i+1开始
            for (var j = i + 1; j < arr.length; j++) {
              if (arr[j] < arr[minIndex]) {
                minIndex = j;
              }
            }
    
            // 当假设的最小值和真实的最小值不配,就进行交换,否者不
            if (minIndex !== i) {
              arr[i] = [arr[minIndex], arr[minIndex] = arr[i]][0];
            }
          }
          return arr;
        }
        var res = Select([2, 6, 20, 1, 7]);
        console.log(res);
    
      </script>
    

    四、快速排序

    原理:找中间项,将小于中间项的放在左,大于放在右,再根据递归重复此操作,知道数组里的项小于等于1为止,最后,左+中+右拼接数组。
    UTOOLS1588076384781.png

      <script>
        function Quick(arr) {
          // 6.当arr索引小于等于1时,结束递归
          if (arr.length <= 1) {
            return arr;
          }
          // 1.找到数组的中间项索引
          let middleIndex = Math.floor(arr.length / 2);
          // 2.找到并提取中间项
          let middle = arr.splice(middleIndex, 1)[0];//从中间索引截取1位组成的数组的第一项就是中间项
    
          // 3.准备左边的数组和右边的数组
          let left = [],
            right = [];
          // 4.将小于中间项的数push到左边,大于的push到右边
          for (let i = 0; i < arr.length; i++) {
            arr[i] > middle ? right.push(arr[i]) : left.push(arr[i]);
          }
          // 5.递归重复调用quick,最后拼接左中右
          return Quick(left).concat(middle, Quick(right));
        }
        let res = Quick([22, 5, 9, 2]);
        console.log(res);
      </script>
    
  • 相关阅读:
    mvc实例
    mvc
    设计模式总结
    作业——《XXX》系统设计时所实现的质量属性战术
    实训第十四天
    实训第十三天
    实训第十二天
    实训第十一天
    实训第十天
    实训第九天
  • 原文地址:https://www.cnblogs.com/xiaoaitongxue/p/12796869.html
Copyright © 2011-2022 走看看