归并排序算法,是基于分而治之的思想,核心思路为:
要对一个数组进行归并排序,则先把这个数组从中间切开,变成2个子数组。然后对每个子数组进行归并排序,最后,2个排好序的子数组再合并成一个有序的数组,这样整个数组的排序就完成了。
而对每个子数组进行归并排序,又使用了上述的算法过程,因此是个递归调用。当子数组只有一个元素时,归并排序函数直接返回。
因此,归并排序算法的过程,包括:
- 二分法,切分成2个子数组;
- 递归对2个子数组进行归并排序;
- 将2个排好序的子数组,合并为1个有序数组。
归并排序算法,用C语言实现,代码如下:
void merge_sort(int* parr, int left, int right) { // both left and right are inclusive
if (left >= right) return;
int mid = (left + right) / 2;
merge_sort(parr, left, mid);
merge_sort(parr, mid + 1, right);
merge_sub_array(parr, left, mid, right);
}
两个相邻的有序子数组,合并为一个有序数组的实现代码为:
static void merge_sub_array(int* parr, int left, int mid, int right) {
i