归并排序
归并排序(Merge Sort)是一种基于分治法的排序算法,其核心思想是将一个未排序的数组递归地划分为多个子数组,直到每个子数组只有一个元素,然后通过合并两个有序的子数组来达到排序的目的。
图解说明



归并排序步骤
- 分割(Divide):将数组从中间划分为两个子数组。
- 递归排序(Conquer):分别对左半部分和右半部分进行递归排序。
- 合并(Combine):合并两个有序的子数组,形成一个更大的有序数组。
举例解析
- 初始状态:
数组为:
12, 11, 13, 5, 6, 7 - 递归分割:
当每个子数组只剩下一个元素时,递归分割结束,开始合并。
- 第一次分割:
[12, 11, 13]和[5, 6, 7] - 第二次分割:
[12, 11]和[13]、[5, 6]和[7] - 第三次分割:
[12]和[11]、[5]和[6]
- 第一次分割:
- 递归合并:
- 合并
[12]和[11]为[11, 12] - 合并
[5]和[6]为[5, 6] - 合并
[11, 12]和[13]为[11, 12, 13] - 合并
[5, 6]和[7]为[5, 6, 7] - 最后合并
[11, 12, 13]和[5, 6, 7]为[5, 6, 7, 11, 12, 13]
- 合并
代码实现
#
_MergeSort(* a, * tmp, begin, end) {
(end <= begin) ;
mid = (end + begin) / ;
_MergeSort(a, tmp, begin, mid);
_MergeSort(a, tmp, mid + , end);
begin1 = begin, end1 = mid;
begin2 = mid + , end2 = end;
index = begin;
(begin1 <= end1 && begin2 <= end2) {
(a[begin1] < a[begin2]) {
tmp[index++] = a[begin1++];
} {
tmp[index++] = a[begin2++];
}
}
(begin1 <= end1) {
tmp[index++] = a[begin1++];
}
(begin2 <= end2) {
tmp[index++] = a[begin2++];
}
(a + begin, tmp + begin, (end - begin + ) * ());
}
{
* tmp = (*)(() * n);
(tmp == ) {
perror();
;
}
_MergeSort(a, tmp, , n - );
(tmp);
}


