Sort() - 想要一个很好的解释

时间:2015-12-15 03:49:38

标签: javascript function sorting

我明白我需要使用......

var points = [40, 100, 1, 5, 25, 10]; points.sort(function(a, b){return b-a});

...为数组排序其MAX值。我已经阅读了MDN的文档,但我仍然觉得我真的不明白这里发生了什么。

任何人都可以对此有所了解吗?

3 个答案:

答案 0 :(得分:2)

.sort()函数使用优化的排序算法。默认情况下,它会进行词法比较。如果您想使用优化算法,但使用其他比较函数(如数值比较或任何其他类型的自定义排序),那么您需要告诉它的一件事是如何比较两个值。每当它尝试比较数组中的两个值时,它都会调用您的自定义比较函数并将每个值传递给您。然后,您可以使用自定义方式比较这两个值,并返回指示哪个值更高或值是否相等的值。然后,内部.sort()算法使用该信息将这两个值相对于彼此正确定位。

您的自定义函数会返回三种可能之一,负数,零或正数,具体取决于a < ba === b还是a > b

只做return b - a的函数是一个非常简单的反向数字排序(最高值优先)。如果b > a,则会返回一个数字> 0。如果b === a,则会返回0。而且,如果b < a,则会返回一个< 0,这正是.sort()回调需要做的。

如果您真的只想要最大值并且不需要对数组进行实际排序,那么您可以这样做:

&#13;
&#13;
var points = [40, 100, 1, 5, 25, 10];
var maxPoint = Math.max.apply(Math, points);

// should output
document.write(maxPoint);
&#13;
&#13;
&#13;

答案 1 :(得分:1)

如果从传递的匿名函数打印a和b

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){console.log('a = '+ a + ' b = ' + b);return b-a});
a = 40 b = 100
a = 40 b = 1
a = 1 b = 5
a = 40 b = 5
a = 1 b = 25
a = 5 b = 25
a = 40 b = 25
a = 1 b = 10
a = 5 b = 10
a = 25 b = 10
[100, 40, 25, 10, 5, 1]

所以这里

  1. b为100且a为40,因此b - a为正数,因此a较小

  2. a与下一个b进行比较,其为1然后b变小

  3. a(前一个b)与下一个b(即5)进行比较 这个时间a较小,因此使用类似的方法将a与之前的所有方法进行比较
  4. 同样的事情一直持续到整个数组排序

答案 2 :(得分:0)

sort()方法接受一个可选参数,一个定义排序顺序的函数。此函数一次比较两个值,必要时交换它们以生成排序数组。

此比较函数返回一个基本上控制排序顺序的数字。在你的情况下,函数返回第二个arg和第一个arg之间的差异,这意味着如果b> a(在数组的前2个元素的情况下:40和100),b将首先放在结果数组中,然后对数组进行降序排序。

基于函数结果交换数组元素的过程重复进行,直到不需要交换为止。请参阅维基百科的冒泡排序说明:https://en.wikipedia.org/wiki/Bubble_sort