洗牌算法

网站模块化项目第一期终于在加班75天后完成了。算法

接下去要多看书还要多看娃数组

 

项目需求数组随机排序dom

洗牌算法

数组随机排序其基本原理是洗牌算法(Fisher–Yates shuffle):模块化

是一种将有限集合的顺序打乱的一种算法网站

首先是一种常见的错误随机排序

为何是错误的排序我也是看了一篇文字spa

连接:https://gold.xitu.io/entry/573164cc1ea4930064f70b013d

比较常见的用法  递归的方法来处理

underscore.js 中的 shuffle 方法

原理

定义一个数组(shuffled),长度(length)是原数组(arr)长度
取 0 到 index (初始0) 随机值 rand, shuffled[index] = shuffled[rand],code

shuffled[rand] = arr[index]
index++ ; 重复第二步,blog

直到 index = length -1
就是 shuffled 从 0 到 length-1 的赋值过程,而且新加入的值是 arr[index],shuffled[index] 的值是已赋值的元素中随机值shuffled[rand],由于这样会有两个重复的值,因此 shuffled[rand] 就等于新加入的值 arr[index]排序

 

 第三种 使用临时变量保存  

 

Knuth-Durstenfeld Shuffle

Fisher-Yates 洗牌算法的一个变种是 Knuth Shuffle

每次从未处理的数组中随机取一个元素,而后把该元素放到数组的尾部,即数组的尾部放的就是已经处理过的元素,这是一种原地打乱的算法,每一个元素随机几率也相等,时间复杂度从 Fisher 算法的 O(n2)提高到了 O(n)

  1. 选取数组(长度n)中最后一个元素(arr[length-1]),将其与n个元素中的任意一个交换,此时最后一个元素已经肯定
  2. 选取倒数第二个元素(arr[length-2]),将其与n-1个元素中的任意一个交换
  3. 重复第 1 2 步,直到剩下1个元素为止
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;
}
相关文章
相关标签/搜索