在Javascript Sort中真正发生了什么

时间:2011-12-21 11:14:46

标签: javascript function sorting

我看到这种排序功能正常工作:

var arr = [1,5,3,7,8,6,4,3,2,3,3,4,5,56,7,8,8];


console.log(arr.sort(
    function(a,b) {
        return a - b;
    }
    ));

但我真的不明白这个小功能的机制。当它比较a和b时,它真正比较了哪个数组?如果说,它拿起前两个数字1和5,该函数将返回-4。这对排序顺序意味着什么?或者它只是负布尔值?即使是这样,这种排序真的如何发生?

3 个答案:

答案 0 :(得分:7)

基本上,排序的工作方式是一次比较两个元素。比较不仅仅是布尔值 - 您有三个选项:小于,等于和大于。在JavaScript中,这三个值由n< 0,0和n>分别为0。

换句话说,负数表示a < b; 0表示a = b,积极表示a > b

回答更广泛的问题:有一些相对较快的算法可以通过比较其元素来对列表进行排序。最受欢迎的是Quicksort;然而,Quicksort并不稳定,因此一些引擎(Firefox肯定会)使用不同的算法。一个简单的稳定排序是Mergesort

排序算法通常是介绍CS类中分析的第一批算法中的一些,因为它们很简单但仍然有趣且非常重要,足以说明如何分析算法。你应该阅读它们,因为它们非常酷。

稍微随意一点:

您还可以想象使用特殊类型(如枚举)来做这类事情。例如,比较函数可以适当地返回LTGTEQ。但是,在像JavaScript这样的动态语言中,使用数字要容易得多。在更痴迷于类型的语言中(如Haskell :)),使用特殊的订单类型更有意义。

答案 1 :(得分:1)

你有3个选项减去( - ),等于(==)和加号(+):

  • 减去:如果a - b < 0,则在a之前b
  • 等于:无所谓
  • :如果a - b > 0,则在b之前a

有关详细信息,请参阅此主题:Javascript Array.sort implementation?

答案 2 :(得分:0)

将函数传递给Array.sort时,它将用于比较ab。它们的排序方式取决于函数返回的内容:

  • 如果result < 0,那么a就会出现在b;
  • 之前
  • 如果result == 0,则ab已按正确顺序排列;
  • 如果result > 0,则a后面会b

如果在没有参数的情况下调用sort,则会将项目转换为字符串并进行比较。

顺便说一句,sort使用哪种算法完全取决于浏览器的实现。它可以是快速排序,合并排序或其他任何东西。 ECMAScript标准没有规定这方面的任何要求。

相关问题