📜  js shuffle 数组 - Javascript (1)

📅  最后修改于: 2023-12-03 15:02:22.483000             🧑  作者: Mango

JS Shuffle 数组 - Javascript

在 Javascript 中,shuffling(洗牌)数组是一个常见的需求。 实现这个功能有多种方法,下面将介绍两种基本的方法来shuffle数组。

代码实现
方法1 - Fisher-Yates shuffle

Fisher-Yates shuffle,也称为 Knuth shuffle,是一个随机交换数组中元素的算法,该算法在 O(n) 的时间复杂度内有效地打乱数组。

/**
* 对数组进行随机shuffle
* @param {Array} arr - 需要shuffle的数组
* @returns {Array}    - shuffle后的数组
*/
function shuffle(arr) {
  let i, j, temp;
  for (i = arr.length - 1; i > 0; i--) {
    j = Math.floor(Math.random() * (i + 1));
    temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
  }
  return arr;
}
方法2 - sort + Math.random

另一种shuffle数组的方法是将数组排序,使用 Math.random 函数作为排序函数的比较值。由于随机数分布均匀,所以这种方法同样会打乱数组。 这种方法的时间复杂度是 O(nlogn),略慢于 Fisher-Yates shuffle。

/**
* 使用sort方法对数组进行随机shuffle
* @param {Array} arr - 需要shuffle的数组
* @returns {Array}    - shuffle后的数组
*/
function shuffleSort(arr) {
  return arr.sort(() => Math.random() - 0.5);
}
使用方法
const arr = [1, 2, 3, 4, 5];
console.log(shuffle(arr)); // [2, 5, 1, 4, 3]
console.log(shuffleSort(arr)); // [1, 5, 3, 2, 4]

其中,shuffle(arr) 使用 Fisher-Yates shuffle 实现,shuffleSort(arr) 使用 sort + Math.random 实现。

结语

以上两种方法都是 JavaScript 中shuffle数组的常用方法,根据实际场景选择合适的方法来实现。