如何在JavaScript中执行Butterfly Shuffle?

JavaScript中的蝴蝶随机排列数组是一个Numbers数组,其排序方式是使数字随着我们接近数组中心而减少,而随着我们接近数组末尾而增加。最大的数字位于第一个索引处。

蝴蝶混排数组的另一个变体是数字朝着中心增加而朝着末端减少。在这种情况下,最小的数字放在最前面的索引处。

对于具有数学背景的人来说,它与高斯分布有一定的关系。

假设我们有这个数组-

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]

我们的工作是编写一个将Numbers数组和一个字符串作为第二个参数的函数,该字符串可以采用两个值“ asc”或“ des”中的任何一个。-

  • 如果string为'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') => {
   //创建一个数组的新副本,这样我们就不会变异原始的
array
   const arr = array.slice();
   //升序或降序排序
   arr.sort((a, b) => order === 'asc' ? a-b : b-a);
   const first = [], second = [];
   //此变量以后将帮助确定要使用哪个数组
reversed
   //以及将哪个连接到哪个
   //如果长度是偶数,则表示最后一个元素将进入第二个数组
   //否则它将进入第一个数组
   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
]