網站模塊化項目第一期終於在加班75天后完成了。算法
接下去要多看書還要多看娃數組
項目需求數組隨機排序dom
數組隨機排序其基本原理是洗牌算法(Fisher–Yates shuffle):模塊化
是一種將有限集合的順序打亂的一種算法網站
爲何是錯誤的排序我也是看了一篇文字spa
連接:https://gold.xitu.io/entry/573164cc1ea4930064f70b013d
定義一個數組(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]排序
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; }