作为一名大多数PHP开发人员(并且自学成才),我从来没有理由去了解或理解排序算法背后的算法,除了快速排序平均最快,而且通常是PHP背后的算法排序功能。
但我很快就会有一个待处理的面试,他们建议您理解像这样的基本算法。所以我打开了http://www.geeksforgeeks.org/quick-sort/并实现了我自己的QuickSort和Partition函数,当然也是为了按照其中一个值对数组进行排序。我提出了这个问题(我使用的是PHP 7.1,所以语法相对较新)
$Tries = 1000;
$_Actions = $Actions;
$Start = microtime(true);
for ($i = 0; $i < $Tries; $i++) {
$Actions = $_Actions;
usort($Actions, function($a, $b) {
return $b['Timestamp'] <=> $a['Timestamp'];
});
}
echo microtime(true) - $Start, "\n";
$Start = microtime(true);
for ($i = 0; $i < $Tries; $i++) {
$Actions = $_Actions;
QuickSort($Actions, 'Timestamp');
}
echo microtime(true) - $Start, "\n";
它有效!真棒!所以我认为,使用它没有任何意义,因为这种算法的PHP解释版本无法比编译的C版本更快(就像在usort中使用的那样)。但对于它,我决定对这两种方法进行基准测试。
令我惊讶的是,我的速度更快!
1.274071931839
这为第一个0.87327885627747
提供了一致的数字,第二个为usort
。
我有什么愚蠢的东西会导致这种情况吗? usort
是不是真的使用了快速排序的实现?是因为我没有考虑数组键(在我的情况下,我不需要键/值对保持不变)?
以防万一有人想在PHP中使用完成的QuickSort函数,这就是我最终得到的结果,它按列排序,降序,大约是原生function array_column_sort_QuickSort_desc(array &$Array, $Column, int $Start = 0, int $End = null): void {
$End = $End ?? (count($Array) - 1);
$Stack = [];
$Top = 0;
$Stack[$Top++] = $Start;
$Stack[$Top++] = $End;
while ($Top > 0) {
$End = $Stack[--$Top];
$Start = $Stack[--$Top];
if ($Start < $End) {
$Pivot = $Array[$End][$Column];
$PartitionIndex = $Start;
for ($i = $Start; $i < $End; $i++) {
if ($Array[$i][$Column] >= $Pivot) {
[$Array[$i], $Array[$PartitionIndex]] = [$Array[$PartitionIndex], $Array[$i]];
$PartitionIndex++;
}
}
[$Array[$End], $Array[$PartitionIndex]] = [$Array[$PartitionIndex], $Array[$End]];
$Stack[$Top++] = $Start;
$Stack[$Top++] = $PartitionIndex - 1;
$Stack[$Top++] = $PartitionIndex + 1;
$Stack[$Top++] = $End;
}
}
}
的一半。 (迭代,非递归,分区函数也是内联的)
{{1}}
答案 0 :(得分:2)
考虑传递给QuickSort
的参数与传递给usort()
的参数之间的差异。 usort()
具有更通用的接口,它根据比较功能运行。您的QuickSort
专门针对您的特定数据类型,以及通过>
运营商进行比较。
很可能,性能上的差异可归因于评估函数调用相对于评估单个>
操作的成本要高得多。这种差异很容易淹没usort()
可能带来的任何固有效率优势。此外,考虑因为它依赖于用PHP编写的比较函数,usort()
的操作涉及运行大量PHP,而不仅仅是编译的C代码。
如果您想进一步探讨这一点,请考虑修改您的实现,以呈现usort()
所做的相同界面。我倾向于猜测usort()
会赢得与这种手动变化相比较的苹果与苹果之间的比较,但很难预测性能。这就是我们测试的原因。