Array.prototype.sort
就地对数组元素进行排序并返回已排序的数组。
compareFunction(a, b)
的要求是:
<0
,以便在a
b
0
以保持a
和b
的原始位置(相对于彼此)>0
,以便b
之前放置a
。由于每个浏览器提供商都可能采用不同的方式实现排序算法,我的问题是:可能会提供compareFunction
,这会导致sort
函数在尝试时进入无限循环对元素进行排序?
如果是这样 - 万一有可能 - 它会被视为实施中的错误,或者compareFunction
没有遵循上述指示 - 可以获得意想不到的结果吗?< / p>
要明确 - 我不是在询问是否可以在
while (true);
内添加compareFunction
。
答案 0 :(得分:4)
我要说“不”。
虽然情况是 a 排序实现可以用不稳定的比较函数(使调用函数无效且结果不可预测)可以“挂起”的方式编写,这只是排序实现中的一个严重缺陷 - 我更多地赞扬了浏览器中广泛使用和彻底审查的排序实现的作者/贡献者。
Quicksort,mergesort和bubblesort(作为三个常见示例)总是在每次迭代时减少并且不能被卡住。
答案 1 :(得分:0)
使用的排序算法假设要排序的项目形成total order。这意味着,如果说'a&#39;&#39; b&#39;&#39; c&#39;确实有一个订单。也许&#39; b&#39; &#39;一个&#39; &#39; C&#39 ;.假设你的比较函数只是比较两个项目(不调用一个不会终止的函数),那么如果你的比较函数没有很好地定义,那么整个订单就不能很好地定义。
即如果b < c
和c < b
那么哪一个先来? b
或c
。
所以如果你有这样的比较函数(不是真正的代码):
compare(a,b) = select at random from [-1, 0, 1]
然后当使用相同的值调用时,结果可能会有所不同。这也意味着没有明确定义的顺序 - 虽然这不能保证无限循环,但可能会持续一段时间 - 然后它也可能会很快停止!但总的来说,我会说不,因为这不是一个定义明确的比较。