2017-08-03 151 views
2

我正在閱讀CRLS並在JavaScript中實現算法。通過在javascript中排序來隨機播放數組

在第5.3節 - 通過排序進行排列,在嘗試提出簡單算法的有效實現時,我感覺自己像一個莫朗。下面是僞代碼: shuffle by sorting

這是我實現

Array.prototype.sortShuffle = function() { 
    const LENGTH = this.length; 
    const CUBE = Math.pow(LENGTH, 3); 

    let P = this 
     .map((e, i) => { 
      return {v: Math.floor(Math.random() * CUBE), e: e} 
     }) 
     .sort((e1, e2) => e1.v > e2.v); 

    P.forEach((e, i) => this[i] = e.e); 
} 

我使出了這個悲傷的解決方案,因爲本地Array.prototype.sort不提供比較的指標,A。排序((e1,e2,i1,i2)=> ...)可能已經完成了。

誰能請提供更有效的解決方案(不執行上述所有排序功能)

回答

1

您可以將其他陣列保持儘可能這使得代碼,這是一個有點清潔「元組」。

Array.prototype.sortShuffle = function() { 
    return this.map(v => [Math.random() * this.length ** 3, v]) 
      .sort(([k1,v1],[k2,v2]) => k1 - k2) 
      .map(([k, v]) => v); 
} 

在速度方面 - 你最好使用Fisher-Yates或其他O(n)算法。

請注意,您在實現中出現錯誤,因爲sort期望比較函數返回正數或負數(而不僅僅是布爾值)。

2

你的代碼實際上做得很不錯,但可以只使用一些樣式改進:

Array.prototype.sortShuffle = function() { 
    const nCubed = Math.pow(this.length, 3); 

    this.map(v => ({ k: Math.random() * nCubed, v })) 
     .sort(({ k: k1 }, { k: k2 }) => k1 - k2) 
     .forEach(({ v }, i) => this[i] = v); 
}; 

特別是,你可以使用shorthand property namesobject destructuring,以及消除一些不必要的變數。另外,你不需要使用Math.floor,因爲浮點數也可以。