昨天在閃存上求到了這道算法題。算法
本學渣剛看到快速排序的時候一點印象都沒有(辛苦培養個人高數老師,母校,祖國我對不起大家),因而百科了下快速排序的計算方法:數組
function quick($arr){ $size=count($arr); if($size>1){ $arr_1=array(); $arr_2=array(); for($i=1;$i<$size;$i++){ if($arr[$i]<$arr[0]){ $arr_1[]=$arr[$i]; } else{ $arr_2[]=$arr[$i];} } $arr_1=quick($arr_1) $arr_2=quick($arr_2); return array_merge($arr_1,array($arr[0]),$arr_2); } else{ return $arr; } } $arr=array(99,233,1,32,54,234,456,54,34,1); print_r(quick($arr));
可是這段代碼卻沒有嚴格按照快速排序的思路來,而是討巧的將數組第一個元素依次和後面的元素相比較,大的和小的分別放到不一樣數組裏,和快速排序的比較交換位位置有所不一樣,這就體現出用計算機計算和人類計算不同得地方了,不過他們的目的都是同樣的:將小的和大的分開來,而後經過遞歸完成排序。函數
學渣表示此次腦洞開的有點大:ui
function quick($arr,&$count){ //參數前加&爲引用形式,可以改變函數外的變量 $size=count($arr); $a=0; $b=$size-1;
if($size>1){ | $n=0; | while($a<$b){ | | $count_1=$count; | | for($i=$b;$i>$a;$i--){ //第一次查找交換 | | | if($arr[$a]>$arr[$i]){ | | | | $b=$i; | | | | $n=$b; | | | | $k=$arr[$a]; | | | | $arr[$a]=$arr[$i]; | | | | $arr[$b]=$k; | | | | $count++; | | | | break; | | | } | | } | | for($j=$a;$j<$b;$j++){ //第二次查找交換 | | | if($arr[$b]<$arr[$j]){ | | | | $a=$j; | | | | $n=$a; | | | | $k=$arr[$a]; | | | | $arr[$a]=$arr[$b]; | | | | $arr[$b]=$k; | | | | $count++; | | | | break; | | | } | | } | | if($count==$count_1){break;} //兩次都沒有交換說明這次循環完成 | } | | $arr_1=array_slice($arr,0,$n); | | $arr_1=quick_1($arr_1,$count); | | $arr_2=array_slice($arr,$n+1,$size-$n-1); | | $arr_2=quick_1($arr_2,$count);
| | return array_merge($arr_1,array($arr[$n]),$arr_2); }else{ | return $arr; } }
$count=0; //count用來統計交換次數
$arr=array(5,8,9,4,3);
$result=quick($arr,$count);
echo "count:".$count." resulte:";print_r($result);