归并排序:使用‘分治策略’,将一个大问题分割成小问题分别解决,然后用所有小问题的答案来解决整个大问题。
<?php
/*
merge函数
1: 需要一个额外的数组
2:把两个已经排序好的数组 通过移动指针,比较大小。小的放入额外数组中 指针往后移动。
3:直到结束,如果排序号的数组还有多余的 则直接放入额外数组中。
4:把额外数组存放到原数组中。此处要注意开始的下标是$left.
*/
function merge(&$arr,$left,$mid,$right){
$arr_l = $left;
$arr_r = $mid+1;
while($arr_l<= $mid && $arr_r<=$right){
if($arr[$arr_l]<$arr[$arr_r]){
$tmp[]=$arr[$arr_l++]; //$tmp[]额外数组
}else{
$tmp[]=$arr[$arr_r++];//此处为简写,与上一句对照相当于 $tmp[]=$arr[$arr_r];$arr_r++;
}
}
while($arr_l<=$mid){ //如果左侧数组有剩余,将其放到$tmp数组中
$tmp[] = $arr[$arr_l++]; //++ 简写
}
while($arr_r<=$right){ //如果右侧数组有剩余,将其放到$tmp数组中
$tmp[] = $arr[$arr_r++]; //++ 简写
}
for($i=0,$len=count($tmp); $i<$len;$i++){// 数组的大小以$tmp的大小为准
$arr[$left+$i]= $tmp[$i]; //$arr 从$left的位置开始
}
}
function mSort(&$arr, $left, $right) {
if($left == $right){//递归结束的条件。
return;
}else{
$center = floor(($left+$right) / 2);
mSort($arr, $left, $center); //改变参数进行递归。
mSort($arr, $center+1, $right);
merge($arr, $left, $center, $right);
}
}
$arr = [11,10,9,8,7,6,5,4,3,2,1,3];
$left = 0;
$right=count($arr)-1;
mSort($arr,$left,$right);
echo '<pre>';
print_r($arr);
?>