返回

前端必刷手写题系列 [15] - 随机打乱数组

前端

前端必刷手写题系列[15] - 随机打乱数组

这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战
25. 随机打乱数组
问题是什么
问题很清晰,就是给你个数组,让你随机打乱顺序。
分析
有一个常用写法是这个, 利用 Math.random():
function shuffle(arr) {
  var len = arr.length;
  for (var i = 0; i < len - 1; i++) {
    var randomIndex = Math.floor(Math.random() * (len - i));
    var temp = arr[randomIndex];
    arr[randomIndex] = arr[len - i - 1];
    arr[len - i - 1] = temp;
  }
}
但是这个写法有个问题,那就是时间复杂度是 O(n^2),不够理想。有一种更好的写法,时间复杂度是 O(n),代码如下:
function shuffle(arr) {
  var len = arr.length;
  for (var i = 0; i < len; i++) {
    var randomIndex = Math.floor(Math.random() * (i + 1));
    var temp = arr[randomIndex];
    arr[randomIndex] = arr[i];
    arr[i] = temp;
  }
}
这个写法之所以时间复杂度是 O(n),是因为每次只交换一个元素,时间复杂度是 O(1),一共交换 n 次,所以时间复杂度是 O(n)。
参考实现
```javascript function shuffle(arr) { var len = arr.length; for (var i = 0; i < len; i++) { var randomIndex = Math.floor(Math.random() * (i + 1)); var temp = arr[randomIndex]; arr[randomIndex] = arr[i]; arr[i] = temp; } } ```
运行结果
```javascript console.log(shuffle([1, 2, 3, 4, 5])); // [5, 3, 1, 4, 2] ```
结语
以上就是随机打乱数组的几种方法,希望对你有帮助。