我看到这种排序功能正常工作:
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。这对排序顺序意味着什么?或者它只是负布尔值?即使是这样,这种排序真的如何发生?
答案 0 :(得分:7)
基本上,排序的工作方式是一次比较两个元素。比较不仅仅是布尔值 - 您有三个选项:小于,等于和大于。在JavaScript中,这三个值由n< 0,0和n>分别为0。
换句话说,负数表示a < b
; 0
表示a = b
,积极表示a > b
。
回答更广泛的问题:有一些相对较快的算法可以通过比较其元素来对列表进行排序。最受欢迎的是Quicksort;然而,Quicksort并不稳定,因此一些引擎(Firefox肯定会)使用不同的算法。一个简单的稳定排序是Mergesort。
排序算法通常是介绍CS类中分析的第一批算法中的一些,因为它们很简单但仍然有趣且非常重要,足以说明如何分析算法。你应该阅读它们,因为它们非常酷。
稍微随意一点:
您还可以想象使用特殊类型(如枚举)来做这类事情。例如,比较函数可以适当地返回LT
,GT
或EQ
。但是,在像JavaScript这样的动态语言中,使用数字要容易得多。在更痴迷于类型的语言中(如Haskell :)),使用特殊的订单类型更有意义。
答案 1 :(得分:1)
你有3个选项减去( - ),等于(==)和加号(+):
a - b < 0
,则在a
之前b
a - b > 0
,则在b
之前a
有关详细信息,请参阅此主题:Javascript Array.sort implementation?
答案 2 :(得分:0)
将函数传递给Array.sort
时,它将用于比较a
和b
。它们的排序方式取决于函数返回的内容:
result < 0
,那么a
就会出现在b
; result == 0
,则a
和b
已按正确顺序排列; result > 0
,则a
后面会b
。如果在没有参数的情况下调用sort
,则会将项目转换为字符串并进行比较。
顺便说一句,sort
使用哪种算法完全取决于浏览器的实现。它可以是快速排序,合并排序或其他任何东西。 ECMAScript标准没有规定这方面的任何要求。