SomeArray.sort(function(){...})语句背后的逻辑是什么?

时间:2012-09-16 18:24:40

标签: javascript arrays sorting random shuffle

var array = [3,9,23,76,1,54,21,12,0,9,2];
var shuffled = array.sort(function() {return 0.5 - Math.random()});
console.log(shuffled);  

我知道结果,也对他们感到满意。

上面的代码返回了数组元素的随机顺序。

我很困惑为什么会导致输出。

.sort内部函数的重点是什么?它对输出的贡献是什么?

3 个答案:

答案 0 :(得分:1)

该函数实际上有两个参数,即数组中的两个参数。目的是比较这些元素并返回一个数字 如果数字为正数,则第二个项目应该在第一个项目之前 如果数字为0或负数,则第二项应位于第一项之后。

[0,1].sort(function(a,b){return  1;}); // [1, 0], reverses order
[0,1].sort(function(a,b){return  0;}); // [0, 1], does nothing
[0,1].sort(function(a,b){return -1;}); // [0, 1], does nothing 

在上述示例的每种情况下,a === 0b === 1


逐步输出编辑

要逐步查看[1,3,2,4,4,0]上升序排序发生的情况,可以编写一个记录每个步骤的确切内容的函数

arr = [1,3,2,4,4,0];
arr.sort(function(a,b){ // ascending order sort
    var result = a-b,
    str = '';
    if(result > 0) str = 'so swapping';
    else if(result === 0) str = 'so ignoring'
    else str = 'so continuing';
    console.log('with [ '+arr.join(', ')+' ]','comparing',a,'to',b,'resulting in',result, str);
    return result;
});
console.log('resulting in [ '+arr.join(', ')+' ]');

输出

with [ 1, 3, 2, 4, 4, 0 ] comparing 1 to 3 resulting in -2 so continuing
with [ 1, 3, 2, 4, 4, 0 ] comparing 3 to 2 resulting in 1 so swapping
with [ 1, 3, 3, 4, 4, 0 ] comparing 1 to 2 resulting in -1 so continuing
with [ 1, 2, 3, 4, 4, 0 ] comparing 3 to 4 resulting in -1 so continuing
with [ 1, 2, 3, 4, 4, 0 ] comparing 4 to 4 resulting in 0 so ignoring
with [ 1, 2, 3, 4, 4, 0 ] comparing 4 to 0 resulting in 4 so swapping
with [ 1, 2, 3, 4, 4, 4 ] comparing 4 to 0 resulting in 4 so swapping
with [ 1, 2, 3, 4, 4, 4 ] comparing 3 to 0 resulting in 3 so swapping
with [ 1, 2, 3, 3, 4, 4 ] comparing 2 to 0 resulting in 2 so swapping
with [ 1, 2, 2, 3, 4, 4 ] comparing 1 to 0 resulting in 1 so swapping
resulting in [ 0, 1, 2, 3, 4, 4 ]

为了完整性,原始问题中的混洗算法的概率表(估计,基于每个指数的500,000次试验),X是起始指数

 x     0     1     2     3     4     5     6     7     8     9    10
 0 |  8.0,  8.0,  6.2,  6.6,  9.2, 10.8,  9.3,  6.6,  6.2,  9.7, 18.8
 1 |  4.5,  4.6,  7.8, 12.2, 16.9, 12.9, 11.4, 10.7,  8.7,  6.1,  3.6
 2 | 15.5, 15.5, 10.3,  5.9,  3.7,  3.8,  5.7,  8.3, 10.6, 11.7,  8.5
 3 | 10.4, 10.3, 13.4, 10.2,  7.0,  6.5,  7.8,  9.4,  9.7,  8.8,  6.0
 4 |  6.4,  6.3, 10.7, 15.4, 11.4,  9.5,  9.6,  9.9,  8.9,  6.9,  4.4
 5 | 16.1, 16.1, 10.9,  7.7,  7.4,  7.6,  6.2,  4.4,  4.1,  6.5, 12.5
 6 |  4.7,  4.7,  7.1,  9.7, 12.6, 16.3, 13.6, 11.9,  9.2,  6.1,  3.6
 7 |  6.0,  6.0,  7.7,  8.9,  9.4, 10.9, 14.0, 13.6, 11.2,  7.4,  4.3
 8 |  8.4,  8.3,  9.1,  8.6,  7.3,  6.7,  8.2, 11.6, 13.8, 10.8,  6.7
 9 | 11.5, 11.4, 10.1,  7.6,  5.0,  3.7,  4.2,  6.7, 10.9, 15.8, 12.6
10 |  8.0,  8.1,  6.2,  6.6,  9.2, 10.9,  9.2,  6.6,  6.1,  9.8, 18.8

答案 1 :(得分:0)

认为排序的目的是随机排列列表中的项目。 sort()方法的匿名函数要么返回一个正值或负值,这正是回调应该做的。

排序回调应该用于比较两个项目,并分别返回-1,0或-1表示小于,等于和大于。

现在可能还有另外一个关于这是否是一种随机化的好方法的讨论,因为比较函数可以在离散调用中为相同的两个对象返回不同的值.....

答案 2 :(得分:0)

sort的参数是一个排序回调函数,它是一个函数,它应该将两个值作为参数排序并返回负数,0或正数,这取决于第一个值是否比较小,相等或更大比第二个。

在您的特定示例中,此回调完全忽略比较的实际值,而是生成一个带有Math.random的随机数,它返回范围为0 .. 1的值并从0.5中减去它以将结果范围更改为-0.5 .. 0.5。这使得排序随机地假定一个值小于或大于另一个值,并以生成随机混洗的列表结束,而不是按某种“真实”条件排序。