2015-12-15 73 views
-1

我明白我需要使用...排序() - 想一个很好的解释

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

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

谁能一些线索呢?

+2

“排序”的哪一部分你不理解? – Bergi

回答

1

如果你打印一个并通过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. 一个进行比较,这是1则b变小

  3. 一个(前B下一b )进行比较,下一个b,其是5 此时一个较小所以与使用类似方法中的所有以前的相比
  4. 同样的事情持续到整个数组进行排序
+3

注意进行比较的特定顺序取决于所使用的内部排序算法和数组中项目的原始位置 - 从一个JS实现到下一个不一定是相同的顺序。而且,这对你无关紧要。您只需提供比较算法,剩下的就是内部排序算法。 – jfriend00

+2

注意:如果第一个值在第二个值之前出现,函数应该返回一个正数,如果第二个先到达则返回负数,如果它们相等,则返回0。 – Tracker1

2

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

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

刚做的功能return b - a是一个非常简单的反向数值排序(最高值在前)。如果b > a,那么这将返回一个数字> 0。如果b === a,那么这将返回0。而且,如果b < a,这将返回一个数字< 0这也正是.sort()回调需要做。


如果你真的只想要最大值,并不需要真正的数组进行排序,你可以简单地这样做:

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

 
// should output 
 
document.write(maxPoint);

0

排序()方法采用一个可选参数,它定义排序顺序的功能。此函数的两个值在一个时间进行比较,交换它们必要时为了生成所述排序后的数组。

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

根据函数的结果交换数组元素的过程将重复进行,直到不需要交换为止。请参阅Wikipedia的气泡排序说明:https://en.wikipedia.org/wiki/Bubble_sort

+0

您可以确定'sort'不使用冒泡排序,它在比较后甚至不会“交换”它们。 – Bergi

相关问题