关于php的快速排序,如何递归?

发布于 2022-09-02 13:02:59 字数 1943 浏览 15 评论 0

我想实现php下的递归,下面这段代码只能实现第一次排序,
但是不知道如何实现递归,了解了通过把两个左右数组merge一下,还是傻傻搞不明白。
请教各位,帮忙把代码优化下,或者贴下结果。谢谢~

 <?php

 $arr=[66,13,51,76,81,26,57,69,23];

 function swap(&$a,&$b){
    $tmp=$a;
    $a=$b;
    $b=$tmp;
    unset($tmp);
    return true;
 }
function quicksort($arr){
    
    $i=0;
    $j=count($arr)-1;
    $tmpb=$arr[0];// 基准元素 pivot

    while($arr[$i]!==$arr[$j]){
        //先从最右边找
        while ($arr[$j]>$tmpb){
            echo $arr[$j],"比",$tmpb,"大 go on ","\n";
            --$j;
            echo '$j',"减1,下标为",$j,"值为--";echo $arr[$j]."\n";
            echo '现在数组为',"\n";
            var_dump($arr);
        }
        // 如果这个值比pivot小了,那么就交换,然后从开始到左边找
        if($arr[$j]<$tmpb){
            echo $arr[$j],"比",$tmpb,"小了~ ";
            echo '交换',"\n";
            swap($arr[$j],$arr[$i]);
            ++$i;
            echo '现在数组为',"\n";
            var_dump($arr);
            echo '$i',"加1,下标为",$i,"值为--";echo $arr[$i]."\n";
            echo "在从左边开始";
            echo "\n";
        }
        // 然后从左边开始找
        while($arr[$i]<$tmpb){
            echo $arr[$i],'比',$tmpb,'小 go on ',"\n",'';
            ++$i;
            echo '$i',"加1,下标为",$i,"值为---";echo $arr[$i]."\n";
        }

        if($arr[$i]>$tmpb){
            echo $arr[$i],'比',$tmpb,'大了,交换';
            swap($arr[$i],$arr[$j]);
            --$j;
            echo '$j',"减1,下标为",$j,"值为--";echo $arr[$j]."\n";
            echo '现在数组为',"\n";
            var_dump($arr);
            echo "在从右边边开始";
            echo '再走一层最外层while',"\n";
            }
}

    return $arr;
}
$result=quicksort($arr);
echo "========================","最终结果为\n";
var_dump($result);

执行的结果我贴一下:
========================最终结果为
array (
0 => 23,
1 => 13,
2 => 51,
3 => 57,
4 => 26,
5 => 66,
6 => 81,
7 => 69,
8 => 76,
)他只是按找66分成了左右两部分,结合我上面的思路,怎么能递归呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

放低过去 2022-09-09 13:02:59

`

public static function quickSort( $numArr )
{
    $minArr = [];
    $maxArr = [];
    $randKey = array_rand( $numArr );
    $baseNum = $numArr[$randKey];
    unset( $numArr[$randKey] );
    foreach ( $numArr as $num )
    {
        if ( $num >= $baseNum )
            $maxArr[] = $num;
        else
            $minArr[] = $num;
    }
    if ( count( $maxArr ) > 1 )
        $maxArr = self::quickSort( $maxArr );
    if ( count( $minArr ) > 1 )
        $minArr = self::quickSort( $minArr );
    return array_merge( $minArr, [$baseNum], $maxArr );
}`

我是这么做的

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文