归并排序
将数组分为左右两部分,然后分别排序,最后再合并
public function _sort(&$arr,$left,$right){ if($left<$right){ //如果做小于右则,取出中间值,取整。进入递归过程。 $mid = floor(($left+$right)/2); $this->_sort($arr,$left,$mid); $this->_sort($arr,$mid+1,$right); $this->_merge($arr,$left,$mid,$right); } } public function _merge(&$arr,$left,$mid,$right){ $i = $left; $j = $mid+1; $tmp = []; //将两段中最小值取出来,放入临时数组。如果越界则跳出循环。 while($i<=$mid && $j<=$right){ if($arr[$i]<$arr[$j]){ $tmp[]=$arr[$i++]; }else{ $tmp[]=$arr[$j++]; } } //判断,左边是否存在,有则将左边剩余部分全部放到tmp中 while($i<=$mid){ $tmp[]=$arr[$i++]; } //判断,右边是否存在,有则将右边剩余部分全部放到tmp中 while($j<=$right){ $tmp[]=$arr[$j++]; } //将临时数组中数据复制给$arr for($k=0,$len=count($tmp);$k<$len;$k++){ $arr[$left+$k]=$tmp[$k]; } }