归并排序如同精密的交响乐编排:
整个过程体现了"化整为零→有序重组"的哲学,是分治策略的经典实践。
public class MergeSort {
public static void sort(int[] arr) {
int[] temp = new int[arr.length]; // 预分配临时空间
mergeSort(arr, 0, arr.length - 1, temp);
}
private static void mergeSort(int[] arr, int left, int right, int[] temp) {
if (left < right) {
int mid = left + (right - left) / 2;
mergeSort(arr, left, mid, temp); // 左半乐章
mergeSort(arr, mid + 1, right, temp); // 右半乐章
merge(arr, left, mid, right, temp); // 合并乐章
}
}
private static void merge(int[] arr, int left, int mid, int right, int[] temp) {
int i = left; // 左序列指针
int j = mid + 1; // 右序列指针
int t = 0; // 临时数组指针
// 有序合并
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) temp[t++] = arr[i++];
else temp[t++] = arr[j++];
}
// 处理剩余元素
while (i <= mid) temp[t++] = arr[i++];
while (j <= right) temp[t++] = arr[j++];
// 拷贝回原数组
t = 0;
while (left <= right) arr[left++] = temp[t++];
}
public static void main(String[] args) {
int[] data = {38, 27, 43, 3, 9, 82, 10};
sort(data);
System.out.println(Arrays.toString(data)); // [3, 9, 10, 27, 38, 43, 82]
}
}
指标 | 数值 | 说明 |
---|---|---|
时间复杂度 | O(n log n) | 稳定高效 |
空间复杂度 | O(n) | 需要额外存储空间 |
核心优势:
工业案例:
新手必练:
// 降序实现(仅需修改比较符号)
if (arr[i] >= arr[j]) temp[t++] = arr[i++];
高手进阶:
// 迭代版归并排序
public static void iterativeSort(int[] arr) {
int n = arr.length;
int[] temp = new int[n];
for (int size = 1; size < n; size *= 2) {
for (int left = 0; left < n; left += 2*size) {
int mid = Math.min(left + size - 1, n-1);
int right = Math.min(left + 2*size - 1, n-1);
merge(arr, left, mid, right, temp);
}
}
}
归并排序教会我们:
当你能在分布式系统中实现多机归并排序时,说明真正掌握了算法思想的本质迁移——归并排序不仅是排序算法,更是处理复杂系统的思维模型。记住:现代大数据处理的MapReduce框架,正是归并排序哲学在分布式计算中的终极体现。