js 乱序数组三种方法

今天面试的时候被问到实现乱序数组的最简便的方法,自己只知道使用Math.random()和结果数组的笨方法…总结一下。


sort()方法

数组的sort()方法是按照return的值的正负来去做排序判定,所以实现的思路可以是使得返回的值随机正负。

function randArr(arr){
    return arr.sort(()=>{
        return (Math.random()-0.5);
    })
}

Math.random()是生成0.0(包含)~1.0(不包含)之间的随机数。

但这么做是一个伪排序。参考:https://zhuanlan.zhihu.com/p/33260052

有大神做过测试,进行10000次乱序操作后,元素大概率停留在自己的初始位置上

js 乱序数组三种方法_第1张图片


洗牌算法

思路是:

  • 找到数组的最后一个元素
  • 从数组开头到最后一个元素之间,找到随机的一个数
  • 交换两个元素的位置
  • 此时最后一个元素已经是乱序后的结果
  • 指向最后一个元素的索引前移
  • 直到指向索引为0
//洗牌算法
function randArr3(arr){
    var length=arr.length;
    var r=length;
    var rand=0;
    while(r){
        rand=Math.floor(Math.random()*(r--));
        [arr[r],arr[rand]]=[arr[rand],arr[r]];
    }
    return arr;
}

Math.random()+结果数组

function randArr2(arr){
    var res=[];
    var len=arr.length;
    for(var i=0;i<len;++i){
        var index=Math.floor(Math.random()*arr.length);
        res.push(arr[index]);
        arr.splice(index,1);
    }
    return res;
}

你可能感兴趣的:(javascript)