归并排序算法原理与 Java 实现
一、归并排序的递归探寻
1. 思路
理想结果等于成分解断开子结果表达式的公式表示
- 快速排序: 整个数组有序 = 其中一个元素有序 + 其左断开数组有序 + 其右断开数组有序
- 归并排序: 整个数组有序 = 左断开数组有序 + 右断开数组有序 + 两有序数组的有序合并
2. 实现逻辑
2.1 边界条件处理(在最底层时)
if(array == null) return:数组没有元素不用排。if(left == right) return:只有一个元素已经是有序了不用排。if(left > right) return:排不了不要排的,之后下面是符合一般情况的多个元素。
2.2 基础排序验证(在最底层往上点时)
在最底层往上点时,有序数组有序合并操作在最底层能实现两元素之间的比较然后进行排序的。
2.3 跳转结果继续往上回溯
跳转有序数组结果继续往上有序合并维护回溯。
3. 实质
从底层的最小单个断开有序数组往上有序地合并成越来越大的断开有序数组直至合并完成一个整体的有序数组。
4. 代码实现
public static void mergeSort(int[] array) {
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 + 1, right);
merge(array, left, right, mid);
}
private static void merge {
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];
}
}


