• 技术文章 >后端开发 >php教程

    PHP 递归效率分析_PHP

    2016-06-01 12:22:20原创382
    而且是差了3倍的效率。所以,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的版本是一样的。
    看来对递归的效率要具体问题具体分析了。
    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:PHP 递归效率
    上一篇:php 运行效率总结(提示程序速度)_PHP 下一篇:php读取html并截取字符串的简单代码_PHP
    PHP编程就业班

    相关文章推荐

    • windows 2000/xp/2003下安裝apache2.2.3 mysql 5.0.22 php 5.2.0• Joomla使用Apache重写模式的方法_php实例• 请教各位测试这段代码的结果是什么• 小弟我用服务器访问一个网站的二级页面,为什么总被转到它的主页去• file_get_contents函数可否不报错

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网