龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

php 快速排序的算法

时间:2014-09-01 02:50来源:网络整理 作者:网络 点击:
分享到:
快速排序的算法 PHP的递归效率一般认为是低效的。大概一年前,我写了一篇博文,对三种遍历树的方法进行了比较,发现递归算法的效率最低。[http://www.cnblogs.com/niniwzw/archive/2008/06/28/

PHP的递归效率一般认为是低效的。大概一年前,我写了一篇博文,对三种遍历树的方法进行了比较,发现递归算法的效率最低。

http://www.cnblogs.com/niniwzw/archive/2008/06/28/1231410.html

而且是差了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);
        }
    }
}
//该片段来自于http://outofmemory.cn
精彩图集

赞助商链接