洗牌算法

網站模塊化項目第一期終於在加班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;
}
相關文章
相關標籤/搜索