是否有可能在javascript中的排序函数中导致无限循环?

时间:2017-08-08 23:49:32

标签: javascript arrays sorting

Array.prototype.sort就地对数组元素进行排序并返回已排序的数组。

compareFunction(a, b)的要求是:

  1. 获取两个元素(进行比较)
  2. 返回<0,以便在a
  3. 之前放置b
  4. 返回0以保持ab的原始位置(相对于彼此)
  5. 返回>0,以便b之前放置a
  6. 每对元素的返回值必须始终相同。
  7. 由于每个浏览器提供商都可能采用不同的方式实现排序算法,我的问题是:可能会提供compareFunction,这会导致sort函数在尝试时进入无限循环对元素进行排序?

    如果是这样 - 万一有可能 - 它会被视为实施中的错误,或者compareFunction没有遵循上述指示 - 可以获得意想不到的结果吗?< / p>

      

    要明确 - 我不是在询问是否可以在while (true);内添加compareFunction

2 个答案:

答案 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 < cc < b那么哪一个先来? bc

所以如果你有这样的比较函数(不是真正的代码):

compare(a,b) = select at random from [-1, 0, 1]

然后当使用相同的值调用时,结果可能会有所不同。这也意味着没有明确定义的顺序 - 虽然这不能保证无限循环,但可能会持续一段时间 - 然后它也可能会很快停止!但总的来说,我会说不,因为这不是一个定义明确的比较。