归并排序
基本策略(框架)
- 分解原问题
- 解决子问题
- 合并问题解
1945 年,归并排序由冯 · 诺依曼提出。O(nlogn)
算法流程
伪代码
复杂度分析
代码实现
public static int[] MergeSort(int[] arr) {
if (arr.length < 2) {
return arr;
}
int mid = arr.length / 2;
// 包含 0 不包含 mid
// 如果总长度为 10 包含0 不包含 5 0 --> 4
int[] left = Arrays.copyOfRange(arr, 0, mid);
int[] right = Arrays.copyOfRange(arr, mid, arr.length);
return Merge(MergeSort(left), MergeSort(right));
}
public static int[] Merge(int[] left, int[] right) {
// 从小到大排序, left 和 right 比较,较小者放入到 res 中
// 若一方没有元素,则直接把另一方剩余元素放入 res 中
int[] res = new int[left.length + right.length];
// index 控制循环
for (int i = 0, j = 0, index = 0; index < res.length; index++) {
if (i >= left.length) { // left 已经没有元素了
res[index] = right[j++];
}
if (j >= right.length) {// right 没有元素
res[index] = left[i++];
} else {
// 两边比较,较小者放入到 res 中
if (left[i] > right[j]) {
res[index] = right[j++];
} else {
res[index] = left[i++];
}
}
}
return res;
}