如何在 JavaScript 中进行 Butterfly Shuffle?
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 ]
相关文章
有用资源
javascript 参考教程 - 该教程包含有关 javascript 的更多信息:https://www.cainiaomax.com/javascript/

