打乱一个有序数组

作者: 柯琦 | 来源:发表于2019-04-11 15:13 被阅读0次

    sort方法

    let arr = [1,2,3,4,5,6,7,8,9,10];
    arr.sort(()=>{
        return 0.5-Math.random();
    })
    

    Fisher–Yates shuffle洗牌算法

    首先我们有一个已经排好序的数组

    1 2 3 4 5 6 7 8 9
    

    1.从数组末尾开始,选区最后一个元素

    1 2 3 4 5 6 7 8 【9】
    

    在数组一共 9 个位置中,随机产生一个位置,该位置元素与最后一个元素进行交换,如下:
    随机产生的位置为【2】,即arr[2]

    1 2 [3] 4 5 6 7 8 【9】
    

    交换位置:

    1 2 [9] 4 5 6 7 8 【3】
    

    2.接下来从数组倒数第二个元素开始进行上述操作:

    现在数组如下括号内代表已随机后的元素:

    1 2 9 4 5 6 7 【8】 (3)
    

    在数组除去最后一元素的8 个位置中,随机产生一个位置,该位置元素与最后一个元素进行交换,如下:
    随机产生的位置为【5】,即arr[5]

    1 2 9 4 5 [6] 7 【8】 (3)
    

    交换位置:

    1 2 9 4 5 [8] 7 【6】 (3)
    

    3.其实可以看到只要重复第一步操作,既可以将数组乱序排列

    现在数组如下:

    1 2 9 4 5 8 7 (6 3)
    

    代码是实现

    function shuffle(arr) {
      let length = arr.length,
        randomIndex,
        temp;
      while (length) {
        randomIndex = Math.floor(Math.random() * length--);
        temp = arr[length];
        arr[length] = arr[randomIndex];
        arr[randomIndex] = temp;
      }
      return arr;
    }
    
    let arr = [1, 2, 3, 4, 5, 6, 7, 8];
    console.log(shuffle(arr));
    

    使用正向for循环

    function shuffleFor(arr) {
      let length = arr.length,
        randomIndex,
        temp;
      for (var i = 0; i < length; i++) {
        randomIndex = Math.round(Math.random() * (length - 1 - i)) + i;
        temp = arr[i];
        arr[i] = arr[randomIndex];
        arr[randomIndex] = temp;
      }
      return arr;
    }
    let arr1 = [1, 2, 3, 4, 5, 6, 7, 8];
    console.log(shuffleFor(arr1));
    

    代码可优化:

    temp = arr[length];
    arr[length] = arr[randomIndex];
    arr[randomIndex] = temp;
    //可以这样写
    [arr[randomIndex],arr[length]]=[arr[length],arr[randomIndex]]
    

    优化后

    function shuffleSimple(arr) {
      for (var i = 0; i < arr.length; i++) {
        const randomIndex = Math.round(Math.random() * (arr.length - 1 - i)) + i;
        [arr[i], arr[randomIndex]] = [arr[randomIndex], arr[i]];
      }
      return arr;
    }
    let arr2 = [1, 2, 3, 4, 5, 6, 7, 8];
    console.log(shuffleSimple(arr2));
    

    相关文章

      网友评论

        本文标题:打乱一个有序数组

        本文链接:https://www.haomeiwen.com/subject/ioitwqtx.html