标签:等于 取数 算法 com 变量 错误 集合 链接 code
网站模块化项目第一期终于在加班75天后完成了。
接下去要多看书还要多看娃
项目需求数组随机排序
数组随机排序其基本原理是洗牌算法(Fisher–Yates shuffle):
是一种将有限集合的顺序打乱的一种算法
为什么是错误的排序我也是看了一篇文字
链接:https://gold.xitu.io/entry/573164cc1ea4930064f70b01
定义一个数组(shuffled),长度(length)是原数组(arr)长度
取 0 到 index (初始0) 随机值 rand, shuffled[index] = shuffled[rand],
shuffled[rand] = arr[index]
index++ ; 重复第二步,
直到 index = length -1
就是 shuffled 从 0 到 length-1 的赋值过程,并且新加入的值是 arr[index],shuffled[index] 的值是已赋值的元素中随机值shuffled[rand],因为这样会有两个重复的值,所以 shuffled[rand] 就等于新加入的值 arr[index]
Fisher-Yates 洗牌算法的一个变种是 Knuth Shuffle
每次从未处理的数组中随机取一个元素,然后把该元素放到数组的尾部,即数组的尾部放的就是已经处理过的元素,这是一种原地打乱的算法,每个元素随机概率也相等,时间复杂度从 Fisher 算法的 O(n2)提升到了 O(n)
function shuffle(arr){ var length = arr.length, temp, random; while(0 != length){ random = Math.floor(Math.random() * length) length--; // swap temp = arr[length]; arr[length] = arr[random]; arr[random] = temp; } return arr; }
标签:等于 取数 算法 com 变量 错误 集合 链接 code
原文地址:http://www.cnblogs.com/h5monkey/p/6289222.html