“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表。
以n个元素的数组为例:可以看作为n个有序的子表,每个子表的长度为1,然后两两合并,得到n/2个长度为2或1的有序子表。然后再两两合并......如此重复,直到合并为一个长度为n的有序表为止。
以下是用递归法实现的二路归并排序算法:
void MergeSort(int *a, int n)
{
MergePart(a, 0, n - 1);
}
void MergePart(int *a, int low, int high)
{
if (low < high){ //递归的终止条件
int mid = (low + high) / 2; //从中间划分两个子序列
MergePart(a, low, mid); //对左侧子序列进行递归排序
MergePart(a, mid + 1, high); //对右侧子序列进行递归排序
Merge(a, low, mid, high); //归并
}
}
void Merge(int *a, int low, int mid, int high)
{
int i = mid, j = high, k;
for (k = low; k <= high; ++k) //将a中的元素复制到b中,b是一个辅助数组,可以设置为一个全局变量
b[k] = a[k];
k = high;
//以b中mid为界,依次从左右两端有序元素中选择最大的元素放入a中
while (i >= low && j > mid)
a[k--] = b[i] > b[j] ? b[i--] : b[j--];
//以下这两个while只会执行一个
//作用是将剩下的有序元素全部放入a中剩下的空间
while (i >= low)
a[k--] = b[i--];
while (j > mid)
a[k--] = b[j--];
}