昨天在闪存上求到了这道算法题。算法
本学渣刚看到快速排序的时候一点印象都没有(辛苦培养个人高数老师,母校,祖国我对不起大家),因而百科了下快速排序的计算方法:数组
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);