使用比较功能排序

时间:2013-09-27 00:21:05

标签: javascript sorting

所以我理解,给定一个数组,您可以使用自定义比较函数对其进行排序。

如下Javascript中的以下内容:

var arr = [5,4,3,6,7,2];
arr.sort(function(a,b){
    if (a < b)
        return -1;
    else if (a > b)
        return 1;
    else
        return 0;
});

所以我的朋友说我不需要返回0来排序这个场景的列表。此外,他说我们可以从[true,false]返回,而不是从[-1,0,1]返回。真的吗? 我试图找到他的主张的反例,但我不能。我无法想象使用他的代码没有正确排序数组的情况。

这是我朋友给出的例子:

var arr = [5, 4, 3, 6, 7, 2];
arr.sort(function(a, b) {
    return a > b;
});

[-1,0,1]范围内返回是一种好习惯吗?当整数具有可比性时,有什么必要?我注意到,这是多种编程语言的情况,而不仅仅是javascript。就像C中的这个例子一样。

2 个答案:

答案 0 :(得分:1)

告诉你的朋友他们肯定是错的。

[0, 0, 0, -1, -1, -1, 2, 2, 2, 7, 6, 5, 4, 3].sort(function(a, b) { return a > b })

-> [2, 0, 0, -1, -1, -1, 0, 2, 2, 3, 4, 5, 6, 7]

答案 1 :(得分:1)

不,这不是一个好的做法,你应该遵循语言规范,即当第一个元素大于第二个元素时,比较函数应返回正值,当第一个元素低于第二个元素时,应返回负值第二,如果它们是等价的,则为0。

您正在做的事情可能在某些实现中有效,但不可移植。返回truefalse可能会导致他们分别被强制转移到10。并且一些排序算法只需要知道元素A是否大于元素B(例如,Common Lisp语言指定其SORT函数来采用布尔比较函数,因此它显然要求实现使用这样的算法),因此可以获得所需的结果。但是如果一个实现依赖于三态逻辑,它将无法工作 - 返回false0将使它认为这些元素是等价的,并且它可能无法正确排序。