簡體   English   中英

通過在javascript中排序來隨機排列數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM