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>
    
  • 相关阅读:
    NBUT 1120 Reimu's Teleport (线段树)
    NBUT 1119 Patchouli's Books (STL应用)
    NBUT 1118 Marisa's Affair (排序统计,水)
    NBUT 1117 Kotiya's Incantation(字符输入处理)
    NBUT 1115 Cirno's Trick (水)
    NBUT 1114 Alice's Puppets(排序统计,水)
    188 Best Time to Buy and Sell Stock IV 买卖股票的最佳时机 IV
    187 Repeated DNA Sequences 重复的DNA序列
    179 Largest Number 把数组排成最大的数
    174 Dungeon Game 地下城游戏
  • 原文地址:https://www.cnblogs.com/xiaoaitongxue/p/12796869.html
Copyright © 2011-2022 走看看