给定一个数组 nums ,随机打乱成一个没有重复元素的数组。
方法一
每次从未处理的数组中随机取一个元素,然后把该元素放到数组的尾部,即数组的尾部放的就是已经处理过的元素,这是一种原地打乱的算法,每个元素随机概率也相等,时间复杂度为 O(n)
- 选取数组(长度n)中最后一个元素(arr[length-1]),将其与n个元素中的任意一个交换,此时最后一个元素已经确定
- 选取倒数第二个元素(arr[length-2]),将其与n-1个元素中的任意一个交换
- 重复第 1 2 步,直到剩下1个元素为止
function shuffle(arr) {
let length = arr.length;
let random = 0
while (0 != length) {
random = Math.floor(Math.random() * length)
length--;
[arr[length], arr[random]] = [arr[random], arr[length]]
}
return arr;
}
方法二
思路不变,利用无符号右移位运算符向下取整方式
function shuffle(arr){
let length = arr.length
let random = 0;
while(0!=length){
random = (Math.random() * length--) >>> 0;
[arr[length], arr[random]] = [arr[random], arr[length]]
}
return arr;
}
从效率上对比方法一要稍微快一些
本文介绍了两种在JavaScript中实现数组随机打乱的方法,这两种方法都是原地操作且时间复杂度为O(n)。方法一是通过随机选择未处理的元素与尾部元素交换;方法二是利用无符号右移位运算符进行随机选取。两种方法在效率上接近,提供了不同的实现思路。
887

被折叠的 条评论
为什么被折叠?



