归并排序:分治思想详解
基本思想
归并排序(Merge Sort)是**分治法(Divide and Conquer)**的经典应用,由计算机科学先驱约翰·冯·诺依曼于 1945 年提出。其核心思想是:将大问题分解为小问题,解决小问题后合并结果。
算法流程分为两个核心阶段:
- 分(Divide):递归地将当前数组分割成两个子数组,直到每个子数组只包含一个元素(天然有序)
- 治(Conquer):将两个有序子数组合并成一个新的有序数组
归并排序的核心操作是合并两个有序数组:每次比较两个数组的首元素,将较小者放入新数组,直到所有元素合并完成。
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
void _MergeSort(int* a, int* tmp, int begin, int end) {
// 递归终止条件:当子数组只有一个元素时
if (begin == end) {
return;
}
// 计算中间点
int mid = (begin + end) / 2;
// 如果 [begin,mid] 和 [mid+1,end] 有序就可以进行归并了 这里区间不能分为 [begin,mid-1][mid,end] 这是个坑 比如 2 3 6 7
_MergeSort(a, tmp, begin, mid); // 把一组分成左右两个区间
_MergeSort(a, tmp, mid + 1, end);
// 归并
int begin1 = begin, end1 = mid;
int begin2 = mid + 1, end2 = end;
int i = begin;
while (begin1 <= end1 && begin2 <= end2) // 有一个结束了就把没结束的那个全部尾插到后边
{
if (a[begin1] < a[begin2]) {
tmp[i++] = a[begin1++]; // 让小的那个 ++
} else {
tmp[i++] = a[begin2++];
}
}
// 有一个结束了,就把另一个依次插入
(begin1 <= end1) {
tmp[i++] = a[begin1++];
}
(begin2 <= end2) {
tmp[i++] = a[begin2++];
}
(a + begin, tmp + begin, (end - begin + ) * ());
}
{
* tmp = (*)(() * n);
(tmp == ) {
perror();
;
}
_MergeSort(a, tmp, , n - );
(tmp);
tmp = ;
}
{
a[] = {, , , , , };
MergeSort(a, );
( i = ; i < (a) / (a[]); i++) {
(, a[i]);
}
;
}


