先定义递归/分治/归并函数
function merge_sort($data = array(), $start = 0, $length = 0)
{
if($length - $start > 1) {
$middle = floor(($start + $length) / 2);
$data = merge_sort($data, $start, $middle);
$data = merge_sort($data, $middle, $length);
$data = merge($data, $start, $middle, $length);
}
return $data;
}
function merge($data = array(), $start=0, $middle=0, $length=0)
{
$left = $middle - $start;
$right = $length - $middle;
$array_left = array();
$array_right = array();
for($i = 0; $i < $left; $i++) {
$array_left[$i] = $data[$start + $i];
}
for($j = 0; $j < $right; $j++) {
$array_right[$j] = $data[$middle + $j];
}
$m = $n = 0;
for($k = $start; $k < $length; $k++) {
if( ! empty($array_left[$m]) && ! empty($array_right[$n])) {
if($array_left[$m] <= $array_right[$n]) {
$data[$k] = $array_left[$m];
$m++;
} else {
$data[$k] = $array_right[$n];
$n++;
}
} elseif ( ! empty($array_left[$m])) {
$data[$k] = $array_left[$m];
$m++;
} else {
$data[$k] = $array_right[$n];
$n++;
}
}
return $data;
}
调用方法
$result = merge_sort($data, 0, count($data))
返回一个升序的数组
时间复杂度 Θ(n lgn)
难点: 感觉到处是难点 虽然自己成功调试出正确结果,但总是感觉不能全部理解。
(368)