我想實現php下的遞迴,下面這段代碼只能實現第一次排序,
但是不知道如何?遞迴,瞭解了通過把兩個左右數組merge一下,還是傻傻搞不明白。
請教各位,幫忙把代碼最佳化下,或者貼下結果。謝謝~
$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分成了左右兩部分,結合我上面的思路,怎麼能遞迴呢?
回複內容:
我想實現php下的遞迴,下面這段代碼只能實現第一次排序,
但是不知道如何?遞迴,瞭解了通過把兩個左右數組merge一下,還是傻傻搞不明白。
請教各位,幫忙把代碼最佳化下,或者貼下結果。謝謝~
$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分成了左右兩部分,結合我上面的思路,怎麼能遞迴呢?
`
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 );}`
我是這麼做的