以下程序(摘自教程)按照从最低到最高的顺序打印数组。在这种情况下,结果将是2,4,5,13,31
我的问题与函数compareNumbers的参数“a”和“b”有关。当在numArray.sort(compareNumbers)
中调用该函数时,函数的参数a和b将是什么数字。它只是沿阵列移动吗?例如,从a=13
和b=2
开始?之后,比较a = 2和b = 31,函数再次运行吗?或者接下来会比较a=31
和b=4
?
有人可以解释一下这部分是如何工作的,以及它如何设法从最低到最高排序?我不知道该函数如何设法对数组中的数字进行必要的计算。
function compareNumbers(a,b) {
return a - b;
}
var numArray = [13,2,31,4,5];
alert(numArray.sort(compareNumbers));
答案 0 :(得分:7)
传入的特定对取决于所使用的排序算法。由于算法试图对范围进行排序,因此需要能够比较值对来确定它们的排序。每当发生这种情况时,它会调用你的函数来进行比较。
因此,如果没有关于排序算法如何工作的内部知识,您就无法预测哪些对将被比较。算法的选择将直接决定比较哪些元素以及按什么顺序进行比较。
有趣的是,您实际上可以使用比较功能来查看排序的工作方式或对排序算法进行逆向工程!网站sortviz.org通过将自定义比较器传递到跟踪每个元素位置的排序函数,生成排序算法的许多可视化。如果你看一下,你可以看到每个算法移动其元素的方式有多么不同。
更有趣的是,你可以使用比较功能作为进攻性武器!一些排序算法,即快速排序,具有特定的输入,可以使它们比平时运行得慢得多。在"A Killer Adversary for Quicksort,"中,作者详细介绍了如何使用自定义比较器来为排序算法构建错误输入。
希望这有帮助!
答案 1 :(得分:2)
这两个参数将是数组的元素。系统将比较足够的对以便能够正确地对它们进行排序。没有其他保证。
排序方法可以做很多事情;对于其中一些人,请参见http://en.wikipedia.org/wiki/Sorting_algorithm。大多数Javascript实现可能使用quicksort或mergesort的一些变体。
(以下是对这些内容的超级简要说明.Quicksort是:在数组中选择一个元素,重新排列数组,使所有内容都比较大,然后对“较小”和“较大”位进行排序。 Mergesort是:对数组的前半部分进行排序,对数组的后半部分进行排序,然后合并两个已排序的部分。在这两种情况下,您需要对较小的数组进行排序,使用相同的算法进行排序,直到获得数组为止对它们进行排序很小很简单。在这两种情况下,良好的实际实现都会做各种我没有提到过的聪明的事情。)
答案 2 :(得分:0)
将为所有a,b调用它,即排序算法需要对所有数组进行排序。查看http://en.wikipedia.org/wiki/Sorting_algorithm以获取排序算法的简要列表。
答案 3 :(得分:0)
将函数传递给Array.sort()
时,它需要两个参数并返回一个数值。
如果您返回负值,则第一个参数将放在之前数组中的第二个参数。
如果您返回正值,则第一个参数将放在后数组中的第二个参数。
如果您返回 0 ,他们将保持现状。
执行return a - b;
时,如果a小于b (2 - 13 = -11)
,则返回负数;如果b小于(13 - 2 = 11)
,则返回正数;如果a小于(13 - 13 = 0)
则返回0 {{1}}。
就哪些数字按什么顺序进行比较,我认为这取决于javascript引擎的确定。
有关更多详细信息,请查看MDC文档中心的javascript数组排序文档。 https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort
(顺便说一句,我总是查看MDC文档中心有关javascript如何工作的任何问题,他们有关于AFAIK语言的最佳信息。)