如何在 JavaScript 中进行 Butterfly Shuffle?

javascriptweb developmentobject oriented programming更新于 2025/10/8 15:08:17

JavaScript 中的 Butterfly Shuffle 数组是一个数字数组,其排序方式是,当我们接近数组中心时,数字会减少,而当我们接近数组末尾时,数字会增加。最大的数字放在第一个索引处。

Butterfly Shuffle 数组的另一种变体是,数字向中心增加,向末尾减少。在这种情况下,最小的数字放在第一个索引处。

对于有数学背景的人来说,它与高斯分布有点相似。

示例

假设我们有这个数组 −

const arr = [8,2,6,3,9,1,4,5,0,7];

如果我们对它应用蝴蝶洗牌,输出将是 −

[9, 7, 5, 3, 1,0, 2, 4, 6, 8]

看看最大和第二大数字是如何放在两端的,而最小的数字放在中间的。

另一种可能性是 −

[0, 2, 4, 6, 8, 9, 7, 5, 3, 1]

我们的工作是编写一个函数,该函数接受一个数字数组和一个字符串作为第二个参数,该字符串可以采用两个值 ‘asc’ 或 ‘des’ 中的任意一个。 −

  • 如果字符串是 ‘des’,那么我们必须按从升序到降序的顺序对数组进行打乱。

  • 如果它是 ‘asc’,那么我们必须按从降序到升序的顺序对数组进行打乱。

方法

  • 如果字符串是 ‘asc’,我们最初按升序对数组进行排序,否则按降序排序。因此,假设该函数是用‘asc’调用的,那么数组现在看起来像−

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  • 然后我们将数组分成两个数组,使得相邻元素分布在相反的数组中。我们在一个数组中推送元素,同时在另一个数组中取消移动元素,这样就可以反转一个数组,而无需我们手动执行此操作。

这样形成的两个数组看起来像 −

[ 0, 2, 4, 6, 8 ] [ 9, 7, 5, 3, 1 ]
  • 现在最后一步是连接这些数组,之后我们将得到所需的数组。所有这些在代码中看起来像这样 −

示例

const array = [8,2,6,3,9,1,4,5,0,7];
const ButterflyShuffle = (array, order = 'asc') => {
   //创建数组的新副本,这样我们就不会改变原始数组
   const arr = array.slice();
   //根据参数按升序或降序排序
   arr.sort((a, b) => order === 'asc' ? a-b : b-a);
   const first = [], second = [];
   //此变量稍后将有助于确定要反转哪个数组
   //以及要将哪个数组连接到哪个数组
   //如果长度为偶数,则表示最后一个元素将进入第二个数组
   //否则它将进入第一个数组
   const isEven = arr.length % 2 === 0;
   for (let i = 0; i < arr.length; i++){
      if(i % 2 === 0){
         isEven ? first.push(arr[i]) : first.unshift(arr[i]);
         continue;
      };
      isEven ? second.unshift(arr[i]) : second.push(arr[i]);
   };
   return isEven ? second.concat(first) : first.concat(second);
};
console.log(butterflyShuffle(array));
console.log(butterflyShuffle(array, 'des'));

输出

控制台中的输出将是 −

[
   9, 7, 5, 3, 1,
   0, 2, 4, 6, 8
]
[
   0, 2, 4, 6, 8,
   9, 7, 5, 3, 1
]

相关文章


有用资源