cristinazhou / Blog

1 stars 0 forks source link

算法整理 #2

Open cristinazhou opened 2 years ago

cristinazhou commented 2 years ago

解题思路:

leetcode题目:

Fisher-Yates洗牌算法的一个变种是KnuthShuffle每次从未处理的数组中随机取一个元素,然后把该元素放到数组的尾部,即数组的尾部放的就是已经处理过的元素,这是一种原地打乱的算法,每个元素随机概率也相等,时间复杂度从Fisher算法的O(n2)提升到了O(n)
1.选取数组(长度n)中最后一个元素(arr[length-1]),将
其与n个元素中的任意一个交换,此时最后一个元素
已经确定;
2.选取倒数第二个元素(arrflength-2]),将其与n-1个元
素中的任意一个交换;
3.重复第12步,直到剩下1个元素为止
function shuffle( arr ) {
var length=arr.Length, temp, random;
while(0 != length) {
    random=Math.floor(Math.random() * length)
    length--;
    // swap
    temp=arr[lengthl;
    arr[lengthl=arr[random]
    arr[random]=temp;
    return arr;
}