Я не уверен, смогу ли я объяснить себя к вашему удовольствию, но я позволил себе поиграть с этим кодом и нашел несколько других похожих фрагментов со всего Интернета:
Что касается вашего кода, закомментировав возвращаемое значение более высоким уровням рекурсии было отказано в обновленных данных, поступающих с последующих / более низких уровней рекурсии. Другими словами, null
было передано обратно в merging()
вместо данных типа массива - что, конечно, не повторяется / не исчисляется.
Я также обнаружил, что ваш код слишком много для Мой мозг следовал, поэтому я сделал некоторые изменения, чтобы уменьшить раздувание кода и одноразовые переменные.
Код: ( Демо )
function mergeSort($array) {
echo "array = " . json_encode($array) . "\n";
$count = count($array);
if ($count == 1) {
return $array;
}
return merge(
mergeSort(array_splice($array, 0, $count / 2)),
mergeSort($array) // use the leftovers
);
}
function merge($half1, $half2) {
do {
$temp[] = $half1[0] < $half2[0] ? array_shift($half1) : array_shift($half2);
} while(isset($half1[0], $half2[0]));
return array_merge($temp, $half1, $half2); // gather any potential remaining elements
}
$input = [4, 2, 7, 5, 3];
$input = mergeSort($input);
var_export($input);
Вывод:
array = [4,2,7,5,3]
array = [4,2]
array = [4]
array = [2]
array = [7,5,3]
array = [7]
array = [5,3]
array = [5]
array = [3]
array (
0 => 2,
1 => 3,
2 => 4,
3 => 5,
4 => 7,
)
или с вашим вводом, вывод:
array = [4,2,7,5]
array = [4,2]
array = [4]
array = [2]
array = [7,5]
array = [7]
array = [5]
array (
0 => 2,
1 => 4,
2 => 5,
3 => 7,
)