1 $arr = [9, 43, 12, 0, 87, 1]; 2 function merge_sort(&$arr){ 3 _merge_sort($arr, $arr, 0, count($arr) - 1); 4 } 5 6 function _merge_sort(&$s_arr, &$d_arr, $i, $j){ 7 if($i > $j){ 8 return; 9 } 10 if($i == $j){ 11 echo 'aa'; 12 $d_arr[$i] = $s_arr[$i]; 13 return false; 14 } 15 $tmp_arr = array(); 16 $m = intval(($i + $j)/2); 17 echo $m; 18 if($i <= $m){ 19 _merge_sort($s_arr, $tmp_arr, $i, $m); 20 } 21 if($m+1 <= $j ){ 22 _merge_sort($s_arr, $tmp_arr, $m+1, $j); 23 } 24 merge($tmp_arr, $d_arr, $i, $m, $j); 25 } 26 //$s_arr中的$start到$m与$m到$end两个序列都是有序的,将这两个序列合并到$d_arr里面 27 function merge(&$s_arr, &$d_arr, $start, $m, $end){ 28 $i = $start; $j = $m+1;$d_i = $i; 29 while($i <= $m && $j <= $end){ 30 if($s_arr[$i] > $s_arr[$j]){ 31 $d_arr[$d_i++] = $s_arr[$i++]; 32 //$i++; 33 }else{ 34 $d_arr[$d_i++] = $s_arr[$j++]; 35 } 36 } 37 while($i <= $m){ 38 $d_arr[$d_i++] = $s_arr[$i++]; 39 //$i++; 40 } 41 while ($j <= $end) { 42 $d_arr[$d_i++] = $s_arr[$j++]; 43 } 44 }
function merge_sort(&$src) {
$end = count($src) - 1;
$tmp = array();
_merge_sort($src, $src, 0, $end);
}
/*
* 将数组$src_arr从序列$s到$e根据里面的值有序的复制到$to_arr
*/
function _merge_sort(&$src_arr, &$to_arr, $s, $e) {
if ($s > $e) {
return $to_arr;
}
if ($s == $e) {
$to_arr[$s] = $src_arr[$s];
return $to_arr;
}
$m = ceil( ($s + $e)/2 );
$tmp_arr = array();
//将数组$src_arr分别从$s到$m - 1,从$m到$e有序的复制到$tmp_arr中
if ($s < $m) {
_merge_sort($src_arr, $tmp_arr, $s, $m - 1);
}
if ( $e >= $m ) {
_merge_sort($src_arr, $tmp_arr, $m, $e);
}
//
merge($tmp_arr, $to_arr, $s, $m, $e);
}
/*
* $src_arr从$s到$m与从$m到$e分别是一个从小到大的数组
* 现将这样这样两个有序的数组合并为一个有序的数组$to_arr
*/
function merge(&$src_arr, &$to_arr, $s, $m, $e) {
$j = $m;
$to_i = $s;
while ($s < $m && $j <= $e) {
if ($src_arr[$s] < $src_arr[$j]) {
$to_arr[$to_i++] = $src_arr[$s++];
} else {
$to_arr[$to_i++] = $src_arr[$j++];
}
}
while ($s < $m) {
$to_arr[$to_i++] = $src_arr[$s++];
}
while ($j <= $e) {
$to_arr[$to_i++] = $src_arr[$j++];
}
return $to_arr;
}