0

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

因此,在 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中的这个例子一样。

4

2 回答 2

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]
于 2013-09-27T00:36:47.983 回答
1

不,这不是一个好习惯,你应该遵循语言规范,它说比较函数应该在第一个元素大于第二个时返回一个正值,当第一个元素小于第二个时返回一个负值,并且如果它们相等,则为 0。

您正在做的事情可能在某些实现中有效,但不会是可移植的。返回trueandfalse可能会导致它们分别被强制转换为1and 0。而有些排序算法只需要知道元素A是否大于元素B(比如Common Lisp语言指定它的SORT函数是一个布尔比较函数,所以显然要求实现使用这样的算法),所以期望可以得到结果。但是如果一个实现依赖于三态逻辑,它就不会起作用——返回false或者0会让它认为这些元素是等价的,并且它可能无法正确地对它们进行排序。

于 2013-09-27T00:37:39.550 回答