归并排序详解:递归实现与复杂度分析
归并排序(Merge Sort)是典型的分治算法,核心思想是将一个大问题分解为小问题,解决后再合并。与快速排序不同,归并排序不依赖基准值划分,而是通过不断拆分数组直到最小单元,再有序合并。
核心思路
归并排序的逻辑可以概括为:
- 拆分:将数组从中间切分为左右两部分。
- 递归:对左右两部分分别进行归并排序。
- 合并:将两个已排序的子数组合并为一个整体有序数组。
边界处理
在递归过程中,我们需要明确终止条件:
- 数组为空或长度为 0,无需排序。
- 区间内只有一个元素(left == right),天然有序,直接返回。
- 左边界大于右边界,说明区间无效,直接返回。
合并逻辑
当递归回到上一层时,需要将两个有序子数组合并。我们使用临时数组暂存结果,通过双指针比较左右子数组的当前元素,将较小者放入临时数组,最后将临时数组的数据拷回原数组。
代码实现
以下是完整的 Java 实现,包含主入口函数、递归拆分函数以及合并函数。
public class MergeSort {
public static void mergeSort(int[] array) {
if (array == null || array.length < 2) return;
mergeSortFunc(array, 0, array.length - 1);
}
private static void mergeSortFunc(int[] array, int left, int right) {
// 边界条件:区间内只有一个元素或无效区间,直接返回
if (left >= right) return;
int mid = (left + right) / 2;
// 递归拆分左半部分
mergeSortFunc(array, left, mid);
// 递归拆分右半部分
mergeSortFunc(array, mid + , right);
merge(array, left, right, mid);
}
{
left;
mid + ;
[] tmpArr = [right - left + ];
;
(s1 <= mid && s2 <= right) {
(array[s2] <= array[s1]) {
tmpArr[k++] = array[s2++];
} {
tmpArr[k++] = array[s1++];
}
}
(s1 <= mid) {
tmpArr[k++] = array[s1++];
}
(s2 <= right) {
tmpArr[k++] = array[s2++];
}
( ; i < tmpArr.length; i++) {
array[i + left] = tmpArr[i];
}
}
}


