[英]Shuffle an array by sorting in javascript
我目前正在閱讀CRLS並在javascript中實現算法。
在第5.3節“通過排序置換”中,當我試圖提出一種有效的簡單算法實現方法時,我感到很傻。 這是偽代碼:
這是我的實現
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.sort((e1,e2,i1,i2)=> ...)可以解決問題。
任何人都可以提供更有效的解決方案(首先不實現排序功能)
您的代碼實際上做得很好,但是可以使用一些樣式改進:
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);
};
特別是,您可以使用速記屬性名稱和對象解構 ,以及刪除一些不必要的變量。 另外,您不需要使用Math.floor
,因為浮點數也可以使用。
您可以保留其他數組作為這使得代碼有點清潔“元組”。
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)
算法。
請注意,您在實現中犯了一個錯誤,因為排序期望比較器函數返回正數或負數(而不僅僅是布爾值)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.