【发布时间】:2014-01-02 12:51:22
【问题描述】:
我最近阅读了很多关于在 JavaScript 中排序的答案,我经常偶然发现一个如下所示的比较函数:
array.sort(function(a,b){ a > b ? 1 : -1; });
所以它是一个比较函数,如果a 大于b,则返回1,如果a 小于或等于b,则返回-1。如 MDN (link) 所述,比较函数也可以返回零,以确保两个项目的相对位置保持不变:
如果 compareFunction(a, b) 返回 0,则保持 a 和 b 不变 相互尊重,但对所有不同的事物进行排序 元素。
所以官方的例子看起来更像这样:
function compare(a, b) {
if (a < b) return -1;
if (a > b) return 1;
return 0;
}
事实上,通过添加return 0 语句,排序算法通常需要更少的迭代并且总体上运行得更快(JSPerf)。
所以我想知道省略return 0 语句是否有任何优势。
我意识到,在 MDN 上,它还说:
注意:ECMAscript 标准不保证这种行为,并且 因此并非所有浏览器(例如 Mozilla 版本至少可以追溯到 2003)尊重这一点。
指的是行为,如果返回 0,a 和 b 应该保持不变。所以也许,通过返回 0,我们在不同的浏览器中得到一个稍微不同的排序数组?这可能是一个原因吗?还有什么其他理由根本不返回零?
【问题讨论】:
-
它可能会影响你是否得到一个稳定的排序(即相同的元素总是以相同的顺序出现)
-
它更短。就是这样。当您对 100 个以下的元素进行排序时 - 您不在乎。
-
@Emissary 你是说如果我没有
return 0声明,这实际上是一种不稳定的排序? -
function(a,b){ a > b ? 1 : -1; }是完全安全的,前提是您知道您正在排序的数组不包含重复项 - 如果是这种情况,那么每次调用的比较操作会减少一次与包含return 0的版本相比,这对于大型数组可能很重要。 -
@basilikum 除了自己实现排序算法外,您无法做任何事情来保证稳定或不稳定的排序。不幸的是,实现稳定性留给您的脚本运行的browser version。比较运算符只影响速度,甚至这种影响也取决于浏览器/节点版本。
标签: javascript sorting