【PHP】快速排序的「递归」和「非递归」方式

2020-03-13  本文已影响0人  马蹄哒
function quickSort1($arr)
{
    $len = count($arr);
    if ($len<2){
        return $arr;
    }

    $min = $max = $base = [];
    $base_item = $arr[0];
    for ($i=0; $i<$len; $i++){
        if ($arr[$i]<$base_item){
            $min[] = $arr[$i];
        }elseif($arr[$i]>$base_item){
            $max[] = $arr[$i];
        }else{
            $base[] = $arr[$i];
        }
    }
    $min = $this->quickSort($min);
    $max = $this->quickSort($max);
    return array_merge($max,$base,$min);
}
function quickSort($arr)
{
    $borderStack[] = [0, count($arr) - 1]; //数组边界
    while (!empty($borderStack))
    {
        $border = array_pop($borderStack);
        $left = $border[0];
        $right = $border[1];
        $pivot = $arr[$left]; // 分界值
        while ($left < $right)
        {
            while ($left<$right && $arr[$right] >= $pivot) $right--;
            $arr[$left] = $arr[$right];
            while ($left<$right && $arr[$left] < $pivot) $left++;
            $arr[$right] = $arr[$left];
        }
        //$left 等于 $right :
        $arr[$left] = $pivot;
        if ($border[0] < $left - 1) $borderStack[] = [$border[0],$left-1];
        if ($border[1] > $left + 1) $borderStack[] = [$left+1, $border[1]];
    }
    return $arr;
}
上一篇下一篇

猜你喜欢

热点阅读