📅  最后修改于: 2023-12-03 15:02:22.483000             🧑  作者: Mango
在 Javascript 中,shuffling(洗牌)数组是一个常见的需求。 实现这个功能有多种方法,下面将介绍两种基本的方法来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;
}
另一种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数组的常用方法,根据实际场景选择合适的方法来实现。