注意不要混淆“未定义”和“随机”。
一个随机的实现将确实可以被期待每次给予不同的排序。这意味着当发现结果相等时,有特定的代码可以对结果进行混洗。这将使算法更加复杂和缓慢,并且很少是理想的结果。
什么未定义的方法是相反的:在设计算法具有可预测或稳定的订单完全没有已经采取谨慎措施。这意味着每次运行结果可能会有所不同,如果这恰好是算法对该数据的副作用。
您可以在 PHP 源代码中看到核心排序实现。它由“快速排序”(分而治之)和插入排序(一种更简单的对短列表有效的算法)和手动优化的例程组成,用于 2、3、4 和 5 个元素的列表。
因此,平等成员的确切行为将取决于诸如列表大小、这些平等成员在列表中的位置、一批中有多少平等成员等因素。在某些情况下,算法会发现它们是相同的,而不是交换它们(理想情况,因为交换需要时间);在其他情况下,它不会直接比较它们,直到它们已经相对于其他事物移动,因此它们最终会以不同的顺序结束。
如果我有一个数组:['b', 'a', 'c', 'b']并且我要对其进行排序,我会得到:['a','b','b','c']。由于'b' == 'b'php 不能保证一个在另一个之前,因此排序顺序是“未定义”,但是由于它们是相等的,这有关系吗?
如果您使用的排序函数对于不相等的对象返回 0,那么您将面临完全不同的问题。