PHP递归效率分析

来源:文书网 8.78K

而且是差了3倍的效率。所以,PHP中的递归一定要小心的对待。就跟随本站小编一起去了解下吧,想了解更多相关信息请持续关注我们应届毕业生考试网!

PHP递归效率分析

最近写了一个快速排序的算法,发现PHP中的递归效率不能一刀切,在各种不同的服务器中,可能会表现不一样。

  复制代码 代码如下:

function qsort(&$arr)

{

_quick_sort($arr, 0, count($arr) - 1);

}

/**

* 采用递归算法的快速排序。

*

* @param array $arr 要排序的数组

* @param int $low 最低的排序子段

* @param int $high 最高的排序字段

*/

function _quick_sort(&$arr, $low, $high)

{

$low_data = $arr[$low];

$prev_low = $low;

$prev_high = $high;

while ($low < $high)

{

while ($arr[$high] >= $low_data && $low < $high) {

$high--;

}

if ($low < $high) {

$arr[$low] = $arr[$high];

$low++;

}

while ($arr[$low] <= $low_data && $low < $high) {

$low++;

}

if ($low < $high) {

$arr[$high] = $arr[$low];

$high--;

}

}

$arr[$low] = $low_data;

if ($prev_low < $low) {

_quick_sort($arr, $prev_low, $low);

}

if ($low + 1 < $prev_high) {

_quick_sort($arr, $low + 1, $prev_high);

}

}

function quick_sort(&$arr)

{

$stack = array();

array_push($stack, 0);

array_push($stack, count($arr) -1);

while (!empty($stack)) {

$high = array_pop($stack);

$low = array_pop($stack);

$low_data = $arr[$low];

$prev_low = $low;

$prev_high = $high;

while ($low < $high)

{

while ($arr[$high] >= $low_data && $low < $high) {

$high--;

}

if ($low < $high) {

$arr[$low] = $arr[$high];

$low++;

}

while ($arr[$low] <= $low_data && $low < $high) {

$low++;

}

if ($low < $high) {

$arr[$high] = $arr[$low];

$high--;

}

}

$arr[$low] = $low_data;

if ($prev_low < $low) {

array_push($stack, $prev_low);

array_push($stack, $low);

}

if ($low + 1 < $prev_high) {

array_push($stack, $low + 1);

array_push($stack, $prev_high);

}

}

}

下面是测试速度的`代码:

复制代码 代码如下:

function qsort_test1()

{

$arr = range(1, 1000);

shuffle($arr);

$arr2 = $arr;

$t1 = microtime(true);

quick_sort($arr2);

$t2 = microtime(true) - $t1;

echo "非递归调用的花费:" . $t2 . "n";

$arr1 = $arr;

$t1 = microtime(true);

qsort($arr1);

$t2 = microtime(true) - $t1;

echo "递归调用的花费:" . $t2 . "n";

在我的IIS 服务器上(CGI)模式,我的测试结果是:

非递归调用的花费:0.036401009559631

递归调用的花费:0.053439617156982

在我的Apache 服务器上,我的测试结果是:

非递归调用的花费:0.022789001464844

递归调用的花费:0.014809131622314

结果完全相反,而PHP的版本是一样的。

看来对递归的效率要具体问题具体分析了。</p

热门标签