JavaScript排序函数是如何工作的(作为一种算法)

How does the JavaScript sort function work(as an algorithm)?

本文关键字:算法 一种 工作 函数 排序 何工作 JavaScript      更新时间:2023-09-26

采用参数的JavaScript排序函数允许传入函数。

例如:

var myarray=[25, 8, 7, 41]
myarray.sort(function(a,b){return a - b}) //Array now becomes [7, 8, 25, 41]

代码是怎么回事

function(a,b){
    return a - b
}

被解释为提升?它应该分为三种情况,< 0== 0> 0,但当ab可以是任何东西时,这又有什么意义呢?

谢谢!

var myarray=[25, 8, 7, 41]
myarray.sort(function(a,b){return a - b}) //Array now becomes [7, 8, 25, 41]

只需将其更改为

var myarray=[25, 8, 7, 41]
myarray.sort(function(a,b){console.log("comparing " + a + ", " + b);return a - b}) //Array now becomes [7, 8, 25, 41]

在控制台日志中尝试上述代码后,您将看到以下结果

var myarray=[25, 8, 7, 41]
    myarray.sort(function(a,b){console.log("comparing " + a + ", " + b);return a - b}) //Array now becomes [7, 8, 25, 41]

被解释为提升?它应该分为三种情况,<0、==0和>0;但是,当a和b可以是任何东西时,这又有什么意义呢?

首次比较:25.8

现在,让我们来回答您对它如何选择a,b的值的疑问。当您运行代码时,您会看到第一次比较是在25,8之间进行的,如果结果为正,则意味着8较小。所以它只是简单地将其重新排序为8/25。

第二次比较:25.7

下一个比较是在25、7之间进行的,这是因为如果结果是负数,那么第三个数字将放在25之后,并对这三个数字进行排序。

但情况不同了,现在的结果又是积极的。该阵列仍向重新订购

8, 7, 25

之后,它再次执行测试,直到它发现条件是肯定的。所以现在它比较8,7,结果又是否定的。

阵列再次向重新排序

7, 8, 25

第三次比较:25,41

现在,在最后一次比较中,结果为正,这意味着41大于25。

因此,阵列将自身重新排序为

7,8,25,41

回答问题之所以特别棘手,或者至少在细节上是因为没有规范说明浏览器应该实现哪种排序算法。因此,告诉你它在一个浏览器上的具体工作方式可能会因浏览器而异,甚至会随着时间的推移而变化。

不过,要点是,你想把"a"answers"b"看作任何两个值。如果您返回的是"a"-"b"的结果,那么您的排序将按升序进行。如果你做"b"-"a",那么它是按降序排列的。

制作自己的排序函数的好处是,在单独的函数中处理"a"answers"b"后,可以比较它们的值。假设你想按摄氏度值排序,但你的数组只以华氏度为单位。你可以做一些类似的事情:

.sort(function(a,b){ return to_fahrenheit(a) - to_fahrenheit(b);}

函数sort会多次调用compareFunction函数,并将项ab传递给它。这种情况会发生多次,直到数组排序为止。

比较函数应返回:

  • 如果CCD_ 10则为0
  • 如果CCD_ 11则为正数
  • 如果CCD_ 12

现在,让我们来看看代码中的函数,我们有a - b =:

  • 如果CCD_ 14则为0
  • 如果CCD_ 15则为正数
  • 如果CCD_ 16

因此,它返回预期的结果,数组将被正确排序。

有关更多信息,请查看文档。

函数接受两个参数(a,b)。此函数从b中减去a并返回结果。如果返回值为
正-a是一个大于b的数字
负数-a是一个小于b的数字
ZERO-a等于b

行为因浏览器而异:请参阅不同浏览器生成的输出:

var numArray = [20,1,10,2,3];
numArray.sort(function(a,b) {
  document.write("a = " + a + ", b = " + b + "<br />");  
  return a-b}
  );
output on firefox :
a = 20, b = 1
a = 20, b = 10
a = 1, b = 10
a = 2, b = 3
a = 20, b = 2
a = 1, b = 2
a = 10, b = 2
a = 10, b = 3

output on chrome:
a = 20, b = 1
a = 20, b = 10
a = 1, b = 10
a = 20, b = 2
a = 10, b = 2
a = 1, b = 2
a = 20, b = 3
a = 10, b = 3
a = 2, b = 3

希望这能有所帮助!!

因为如果b大于a,它将小于0。如果是a == b,则返回0。否则它将是一个正数。

var a = [5,2,1,3,9,6];
console.log(a.sort(function(a,b){console.log(a+"," +b); return a>b;}));
Result:
5,2 => create array [2,5]
5,1 => need to check 2 and 1. [2,5], [1,5]
2,1 => push 1 before 2? isOk? => OK [1,2,5]
5,3 => need to check 1,2 with 3 before 5 [1,2,5], [3,5] 
2,3 => push 3 after 2 and before 5 => OK [1,2,3,5]
5,9 => [1,2,3,5,9]
9,6 => [1,2,3,5,9], [6,9]
5,6 => [1,2,3,5,6,9]

这通过一个例子更容易理解。让我们研究一下每种可能的情况:

  1. 设a=10,b=20。所以a - b就是-10,按照惯例,如果a < b,我们会返回一个负值,所以我们是好的
  2. 设a=20,b=10。所以a - b就是10,按照惯例,如果a > b,我们会返回一个正值,所以我们仍然是好的
  3. 设a=10,b=10。所以a - b就是0,按照惯例,如果a == b,我们返回0,一切都如预期

一般情况下:如果a < b,则a - b将始终为负;如果a > b,则a - b将始终为正;如果a == ba - b将始终是0,只要ab是整数值即可。

相关文章: