【算法】洗牌算法-数组随机排序

266 阅读1分钟

题目:

写一个函数打乱一个数组,传入一个数组,返回一个打乱的新数组。

以上题目,考察的是数组的随机排序,也称为“洗牌算法”

基本思路

洗牌算法的思路是:

先从数组末尾开始,选取最后一个元素,与数组中随机一个位置的元素交换位置。然后在已经排好的最后一个元素以外的位置中,随机产生一个位置,让该位置元素与倒数第二个元素进行交换。

代码实现

/**
返回一个新数组,数组乱序

从最后一位开始,将数据和其前面位置中随机一个数进行数字交换

从倒数第二位开始,数据和其前面位置中随机一个数进行数字交换

依次地,按照上诉逻辑共进行arr.length轮

*/
let arr = [1, 7, 6, 4, 8, 3, 2, 5]

function shuffle(arr){
  //判断是否是数组
  if(arr instanceof Array === false){
    return
  }
  
  let newArr = Array.from([...arr])//复制一个新数组
  for(let i=newArr.length-1;i>0;i-- ){
    //获取[1,arr.length-1]直接的随机数,包含最大和最小值
    // Math.floor(Math.random()*(max-min+1)+min)
    const randomIndex  = Math.floor(Math.random()*(i+1))
    //newArr[i]和newArr[randomIndex]交换位置
    const tmp = newArr[i];
    newArr[i] = newArr[randomIndex];
    newArr[randomIndex] = tmp
  }
  return newArr
}

shuffle(arr)

相关题目

1.写一个函数打乱一个数组,传入一个数组,返回一个打乱的新数组。

2.需要实现一个小功能:有一个数组,当每次刷新时,数组会随机重新排序生成新的 数组。

3.从一个长度为n的数组中随机选择m个数

4.有一个长度为 100 的数组,如何从中随机挑选 50 个元素,组成一个新的数组?