一、一句话总结
分治:先分成两半分别排序,再合并两个有序数组
二、核心代码
java
public void mergeSort(int[] arr, int left, int right) {
if (left >= right) return;
int mid = (left + right) / 2;
mergeSort(arr, left, mid); // 排左边
mergeSort(arr, mid + 1, right); // 排右边
merge(arr, left, mid, right); // 合并
}
private void merge(int[] arr, int left, int mid, int right) {
int[] temp = new int[right - left + 1];
int i = left, j = mid + 1, k = 0;
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) temp[k++] = arr[i++];
else temp[k++] = arr[j++];
}
while (i <= mid) temp[k++] = arr[i++];
while (j <= right) temp[k++] = arr[j++];
for (int t = 0; t < temp.length; t++) {
arr[left + t] = temp[t];
}
}
三、复杂度
| 指标 | 值 |
|---|---|
| 时间复杂度 | O(n log n)(最好/最坏/平均都一样) |
| 空间复杂度 | O(n)(需要临时数组) |
| 稳定性 | ✅ 稳定 |
四、记忆口诀
左边排,右边排,两个有序合并来
临时数组存结果,最后拷贝回原数组
五、一句话记住
归并排序 = 分治 + 合并,稳定但费空间