Heim > Backend-Entwicklung > PHP-Tutorial > 递归调用 - 关于php的快速排序,如何递归?

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

WBOY
Freigeben: 2016-06-06 20:12:16
Original
1017 Leute haben es durchsucht

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

<code> <?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[$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);
</code>
Nach dem Login kopieren
Nach dem Login kopieren

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

回复内容:

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

<code> <?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[$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);
</code>
Nach dem Login kopieren
Nach dem Login kopieren

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

`

<code>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 );
}`
</code>
Nach dem Login kopieren

我是这么做的

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage