JavaScript排序功能如何工作(作为算法)?

时间:2012-03-22 22:13:29

标签: javascript algorithm sorting

JavaScript sort function which takes a parameter允许传递函数。

例如:

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可以是什么时,这有什么意义呢?

谢谢!

7 个答案:

答案 0 :(得分:6)

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

它的要点是,你想把“a”和“b”视为任何两个值。如果要返回“a” - “b”的结果,那么您的排序按升序排列。如果你做“b” - “a”,那么它按降序排列。

制作自己的排序函数的好处是,您可以在单独的函数中处理它们之后比较“​​a”和“b”的值。因此,假设您要按摄氏温度值排序,但您的数组仅在华氏温度下排序。你可以这样做:

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

答案 1 :(得分:5)

函数sort会多次调用compareFunction函数,并将项目ab传递给它。这将发生多次,直到数组被排序。

比较功能应返回:

  • 0 if a == b;
  • 如果是a > b;
  • ,则为正数
  • 如果为b < a,则为负数。

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

  • 0 if a == b;
  • 如果是a > b;
  • ,则为正数
  • 如果为b < a,则为负数。

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

有关详细信息,请查看documentation

答案 2 :(得分:5)

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]

  

被解释为提升?它应该分为三种情况,&lt; 0,== 0和&gt; 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

答案 3 :(得分:2)

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

答案 4 :(得分:2)

该功能需要2个参数(a,b)。此函数从b中减去a并返回结果。如果返回值为
正数 - a是大于b
的数字 否定 - a是小于b
的数字 零 - 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

希望这会有所帮助!!

答案 5 :(得分:1)

通过示例更容易理解。让我们研究每个可能的案例:

  1. 设a = 10且b = 20。因此a - b-10,按照惯例,如果a < b我们会返回负值,所以我们很好。
  2. 设a = 20且b = 10。因此a - b10,按照惯例,如果a > b我们会返回正值,所以我们仍然很好。
  3. 设a = 10且b = 10。因此a - b0,按照惯例,如果0我们会返回a == b,并且一切都按预期工作!
  4. 一般来说:如果a < ba - b将永远为负;如果a > ba - b将始终为正;如果a == b,则a - b始终为0,只要ab为整数值。

答案 6 :(得分: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]