基于分治(Divide and Conquer)策略的经典 $O(N \log N)$ 稳定排序算法
归并排序由冯·诺伊曼于 1945 年发明,是分治策略(Divide and Conquer)的完美体现:
tmp[L..R] (Conquer & Merge Space)
// 归并排序核心分治代码
void merge(int a[], int l, int mid, int r) {
int i = l, j = mid + 1, k = 0;
while (i <= mid && j <= r) {
if (a[i] <= a[j]) tmp[k++] = a[i++];
else tmp[k++] = a[j++];
}
while (i <= mid) tmp[k++] = a[i++];
while (j <= r) tmp[k++] = a[j++];
for (int p = 0; p < k; p++) a[l + p] = tmp[p];
}
void mergeSort(int a[], int l, int r) {
if (l >= r) return;
int mid = l + (r - l) / 2;
mergeSort(a, l, mid); // 递归划分左子区间
mergeSort(a, mid + 1, r); // 递归划分右子区间
merge(a, l, mid, r); // 运行双指针合并
}