这里所有接受的答案都很好,其中大多数使用两个 for 循环对数组进行排序。起初,代码看起来相当直接,甚至我也这么认为。但后来我想进一步调查。这种方法效率如何?因此,为了保持一致性,我创建了一个包含 10,000 个“计数”或值的数组,并将其写入一个文件以供稍后包含,使用以下代码:
$str = "<?php \n \$array = array( \n";
for($x = 0; $x <= 10000; $x++){
$str .= mt_rand(0,10000).",\n";
}
$str .= "); \n ?>";
$file = fopen('req_arr.php', 'w+');
echo fwrite($file,$str);
fclose($file);
include_once('req_arr.php');
$arr = $array;
然后我使用了这里大多数人给出的两个 for 循环方法,并测量了所花费的时间:
$start = microtime(1);
$cnt = count($arr);
for($i = 0; $i < $cnt; $i++ ){
for($j = 0; $j < $cnt-1; $j++ ){
$temp = '';
if($arra[$j] > $arra[$j+1]){
$temp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $temp;
}
}
}
$stop = microtime(1);
echo $stop - $start;
echo '<pre>'; print_r($arr);
这使执行时间(以秒为单位)为7.5408220291138。
注意:此代码在 Windows10、64 位、i7 gen 4、8 GB RAM 和 Chrome 上的 XAMPP 中进行了测试。
这太过分了。我敢肯定PHP不能这么草率。所以接下来我使用以下代码测试了内置的 PHP rsort() 函数:
$start = microtime(1);
rsort($arr, SORT_NUMERIC);
$stop = microtime(1);
echo $stop - $start;
echo '<pre>'; print_r($arr);
这一次,执行时间仅为0.0033688545227051秒。只需 0.0033688545227051 秒即可对 10,000 个值的数组进行排序。显然,这两个 for 循环方法对于 PHP 在其核心中使用的任何东西都是低效的。
对 Google/PHP.net 的快速研究给了我答案,即 PHP 使用快速排序算法对索引数组进行排序,并且它不使用两个 for 循环而是递归函数。我深入挖掘并找到了一些 C++、Java 等的快速搜索示例。因此,我在 PHP 中复制了它们,如下所示:
/*
The main function that implements QuickSort
arr --> Array to be sorted,
low --> Starting index,
high --> Ending index
*/
function quickSort(&$arr, $low, $high)
{
if ($low < $high)
{
/* pi is partitioning index, arr[p] is now
at right place */
$pi = partition($arr, $low, $high);
// Separately sort elements before
// partition and after partition
quickSort($arr, $low, $pi - 1);
quickSort($arr, $pi + 1, $high);
}
return $arr;
}
function partition (&$arr, $low = 0, $high)
{
$pivot = $arr[$high]; // pivot
$i = ($low - 1); // Index of smaller element
for ($j = $low; $j <= $high-1; $j++)
{
// If current element is smaller than or
// equal to pivot
if ($arr[$j] <= $pivot)
{
$i++; // increment index of smaller element
swap($arr[$i], $arr[$j]);
}
}
swap($arr[$i + 1], $arr[$high]);
return ($i + 1);
}
function swap(&$a, &$b){
$t = $a;
$a = $b;
$b = $t;
}
显然,这可以进一步优化,但我只是想让一些东西运行并查看结果,这就足够了。那么,现在让我们看看结果:
$start = microtime(1);
$sarr = quickSort($array, 0, $cnt-1);
$stop = microtime(1);
echo $stop - $start;
echo '<pre>';print_r($sarr);
die();
该算法所花费的时间为:0.022707939147949
仍然,不如 rsort() 快但令人满意。我也用一百万个值数组尝试了同样的方法,但是两个 for 循环数组刚刚耗尽了内存,我决定即使是 10,000 个值数组也很好地证明了这个理论。
欢呼...