用JavaScript排序:每个比较函数都应该有一个“返回0”语句吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了用JavaScript排序:每个比较函数都应该有一个“返回0”语句吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3042字,纯文字阅读大概需要5分钟。
内容图文
我最近阅读了很多关于JavaScript排序的答案,我经常偶然发现一个比较函数,如下所示:
array.sort(function(a,b){ a > b ? 1 : -1; });
所以它是一个比较函数,如果a大于b则返回1,如果a小于OR EQUAL,则返回-1.如MDN(link)所述,比较函数也可以返回零,以确保两个项目的相对位置保持不变:
If compareFunction(a, b) returns 0, leave a and b unchanged with
respect to each other, but sorted with respect to all different
elements.
所以官方的例子看起来更像是这样的:
function compare(a, b) {
if (a < b) return -1;
if (a > b) return 1;
return 0;
}
实际上,通过添加return 0语句,排序算法通常需要更少的迭代并且总计运行得更快(JSPerf).
所以我想知道在省略return 0语句方面是否有任何优势.
我意识到在MDN上,它还说:
Note: the ECMAscript standard does not guarantee this behaviour, and
thus not all browsers (e.g. Mozilla versions dating back to at least
2003) respect this.
参考行为,如果返回0,则a和b应保持不变.那么也许,通过返回0,我们在不同的浏览器中得到一个稍微不同的排序数组?这可能是个原因吗?是否有任何其他充分理由不返回零?
解决方法:
So I was wondering if there is any advantage on omitting a return 0 statement.
输入更少的字母.由于省略了一个比较,它可能会快一点.所有其他影响都是不利的.
I realized that on MDN, it also says:
Note: the ECMAscript standard does not guarantee this behaviour, and
thus not all browsers (e.g. Mozilla versions dating back to at least
2003) respect this.
参考行为,如果为0,a和b应保持不变
退回.a和b的位置可以保持不变只是stable sort的要求.这不是指定的行为,并且一些浏览器已经实现了非稳定的排序算法.
但是,返回零的实际目的是既不是a在b之前排序(如果小于0),也不是b在a之前排序(如果大于0) – 基本上当a等于b时.这是比较的必备条件,所有排序算法都遵循它.
为了产生有效的,可满足的排序(数学上:将项目划分为totally ordered等价类),比较必须具有某些属性.它们在spec for sort中列为“一致比较功能”的要求.
最突出的是反身性,要求a项等于a(本身).另一种说法是:
compare(a, a)
must always return0
当比较函数不满足这一点时会发生什么(就像你偶然发现的那样)?
规范说
If
comparefn
[…] is not a consistent comparison function for the elements of this array, the behaviour ofsort
is implementation-defined.这基本上意味着:如果提供无效的比较函数,则数组可能无法正确排序.它可能会被随机置换,或者排序调用可能甚至不会终止.
So maybe, by returning 0, we get a slightly different
sorted array in different browsers? Could that be a reason?不,通过返回0,您可以跨浏览器获得正确排序的数组(由于排序不稳定,可能会有所不同).原因是,如果不返回0,则会得到稍微不同的置换数组(如果有的话),甚至可能产生预期的结果,但通常是以更复杂的方式.
那么如果你没有为同等物品返回0会怎么样?有些实现没有问题,因为它们从不将项目与自身进行比较(即使在数组中的多个位置都很明显) – 可以优化这一点并省略对比较函数的代价高昂的调用,因为已知结果必须是0.
另一个极端是永不终止的循环.假设你有两个相同的项目,你会将后者与前者进行比较,并意识到你必须交换它们.再次测试,后者仍然比前者小,你必须再次交换它们.等等…
但是,一种有效的算法大多数情况下不再测试已经比较的项目,因此通常实现将终止.尽管如此,它可能会进行更多或更少的实际上不必要的交换,因此比使用一致的比较函数需要更长的时间.
And are there any other good reasons for not returning zero at all?
懒惰,希望数组不包含重复项.
内容总结
以上是互联网集市为您收集整理的用JavaScript排序:每个比较函数都应该有一个“返回0”语句吗?全部内容,希望文章能够帮你解决用JavaScript排序:每个比较函数都应该有一个“返回0”语句吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。