JavaScript之不可亵玩系列-02 数组乱序与洗牌算法

【原创】码路工人 Coder-Power

大家好,这里是码路工人有力量,我是码路工人,你们是力量。

github-pages
博客园cnblogs


JavaScript之不可亵玩系列-02 数组的随机排序

今日玩法:

  物料:整数数组一个,JavaScript语句若干

  把玩:数组乱序、洗牌


  • 玩法1:利用数组排序函数

    • 玩法介绍:

      • 来认识一下数组自带排序函数Array.prototype.sort

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        // 准备一个有序整数数组
        const arrNums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

        // 排序处理
        const arrRet1 = arrNums.sort(function(right, left){
        // 同 return -1
        return right > left
        })
        console.log('升序排列:', arrRet1)
        // 升序排列: [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]

        // 排序处理
        const arrRet2 = arrNums.sort(function(right, left){
        // 同 return 1
        return right < left
        })
        console.log('降序排列:', arrRet2)
        // 降序排列: [ 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 ]

        sort方法是可以用来排序的,可以自定义排序函数作为回调传进去。

        就在自定义的排序回调函数中,比较结果,如果传一个随机数(大于0或者小于0),

        那不就可以把顺序打乱了嘛。

      • 随机数函数Math.random()

        随机数函数Math.random()可以返回一个1以内的小数,

        0 < Math.random() < 1,用它减去0.5,可能大于0可能小于0。

  • 撸一把:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // --------------------------------------------------
    // 00. array of numbers
    const arrNums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    // --------------------------------------------------
    // 01. shuffle in a normal-way

    const normalShuffle = function (arr){
    return arr.sort(function(){
    return Math.random() - 0.5;
    })
    }

    console.log('normalShuffle:', normalShuffle(arrNums)) // 乱序数组结果

    多执行几次洗牌函数,看看随机乱序结果如何。


  • 玩法2:经典洗牌算法

    • 玩法介绍:

      遍历数组,将遍历过程中每一个元素都与随机数下标元素进行对调,实现数组乱序。

      这就是经典的洗牌算法,比起上面玩法1就显得高端一些了,随机排布更均匀。

    • 撸一把:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      // ------------------------------------------------- 
      // 02. Classic Shuffle

      const classicShuffle = function(arr){
      // parameter check
      if(!arr || toString.call(arr) !== '[object Array]' || !arr.length){
      return;
      }

      // get random index
      function randomIndex(min, max){
      if(max == null){
      max = min;
      min = 0;
      }
      return min + Math.floor(Math.random() * (max - min + 1))
      }

      const count = arr.length;
      // copy to operate
      const arrRet = Array.from(arr);

      // shuffle process
      for(let i = 0; i < count; i++){
      let j = randomIndex(count - 1);
      let x = arrRet[i]
      arrRet[i] = arrRet[j]
      arrRet[j] = x
      }

      return arrRet;
      }

      console.log('classicShuffle', classicShuffle(arrNums))
      // -------------------------------------------------

      经典洗牌算法两个要点,

      • 循环每一个元素,index
      • 得到随机数下标,randomIndex

      交换数组中以上两个元素位置,简单高效。

      注:关于是否操作原数组,这个看需要怎么做都可以

      收工。


–END–


公众号(码路工人有力量)

欢迎关注分享,一起学习提高吧。
QRCode/微信订阅号二维码
CoderPowerQRCode