归并排序是一种分治算法,它通过将数组递归地分成较小的子问题,然后将这些子问题的解合并起来,从而实现整体有序的效果。归并排序的核心思想是将数组不断一分为二,直到分割成单个元素,然后将这些元素两两合并,再依次合并得到最终的有序数组。
function mergeSort($arr) {
// 如果数组长度小于等于 1,则已排序
if (count($arr) <= 1) {
return $arr;
}
// 将数组分为两半
$mid = floor(count($arr) / 2);
$left = array_slice($arr, 0, $mid);
$right = array_slice($arr, $mid);
// 递归地对左右子数组进行排序
$left = mergeSort($left);
$right = mergeSort($right);
// 合并左右子数组
return merge($left, $right);
}
function merge($left, $right) {
$result = [];
$i = 0; // 左子数组的索引
$j = 0; // 右子数组的索引
// 比较左右子数组的元素,并按顺序添加到结果数组
while ($i < count($left) && $j < count($right)) {
if ($left[$i] < $right[$j]) {
$result[] = $left[$i];
$i++;
} else {
$result[] = $right[$j];
$j++;
}
}
// 将剩余的元素添加到结果数组
while ($i < count($left)) {
$result[] = $left[$i];
$i++;
}
while ($j < count($right)) {
$result[] = $right[$j];
$j++;
}
return $result;
}
// 示例用法
$unsortedArray = [5, 3, 1, 2, 4];
$sortedArray = mergeSort($unsortedArray);
print_r($sortedArray);